如何在models.py中为每个类模型重用__str__函数

问题描述:

大家好我开始使用Django Framework,我有一个问题。如何在models.py中为每个类模型重用__str__函数

Django的文件说,当我在课堂上年底创建类(模型),我应该写函数来对我的对象返回字符串值,这一切看起来就像这样:

class NameClass(models.Model): 
    field_name_1 = models.SomeTypeField() 
    field_name_2 = models.SomeTypeField() 
    field_name_3 = models.SomeTypeField() 
    ... 
    field_name_n = models.SomeTypeField() 
    def __str__(self): 
     return self.field_name_1, ...self.field_name_n 

在这种情况下,我写函数返回字符串值,导致我在我的模型中有很多字段,并将它们写入__str__函数中,这将会是很多工作。所以我的功能是这样的:

def __str__(self): 
    fields ='' 
    for x in self._meta.fields: 
     fields = fields + string.split(str(x),".")[2]+' ' 
    return fields 

现在的问题。如何在model.py中的每个类(模型)中重用此函数,而不复制粘贴此函数?

例如。我有很多的类(mdoels):

class FirstModel(models.Model): 
    ... 
    def __str__(self): 
     ... 
class SecondModel(models.Model): 
    ... 
    def __str__(self): 
     ... 

class ThirdModel(models.Model): 
    ... 
    def __str__(self): 
     ... 
class EtcModel(models.Model): 
    .... 
    def __str__(self): 

而且我不想复制粘贴功能我每次,可能存在某种方式来使用它像一个全局函数或另一种方式来解决这个问题。

+0

欢迎来到*! – frederick99

你可以使用继承(从一个基类,提供你想要的__str__方法继承你的类不同)。

或者,如果这不适合你,你只是想以最简单的方式分享这个方法的实现,你可以在你的类中分配方法而不是定义它们。

def mystrfunction(self): 
    return whatever 

class Class1(object): 
    ... 
    __str__ = mystrfunction 

class Class2(object): 
    ... 
    __str__ = mystrfunction 

外,定义一个函数,

def foo(obj): 
    fields ='' 
    for x in obj._meta.fields: 
     fields = fields + string.split(str(x),".")[2]+' ' 
    return fields 

类里面,

class FirstModel(models.Model): 
    ... 
    __str__ = foo 
+1

学分:'__str__ = foo'的khelwood。 – frederick99

+0

我使用了冗余版本。类似于if(a == b)返回true;否则返回false;' – frederick99

+0

@downvoter尽管'def __str __(self):return foo(self)'它并没有错。 – frederick99

如果你的类只共享相同的方法,你可以使用一个混合:

class BaseMixin(object): 
    def __str__(self): 
     return self.something 

class Foo(BaseMixin, models.Model): 
    # ... 

对于共享相同的字段和方法的所有车型,您可以创建一个abstract base class例如:

class Base(models.Model): 
    class Meta: 
     abstract = True 
    title = models.CharField(max_length=255) 

    def __str__(self): 
     return self.title 


class Foo(Base): 
    # ...