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

时间:2017-02-25 21:35:01

标签: python django python-2.7 django-models django-views

大家好我开始使用Django Framework,我有一个问题。

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):

而且我不希望每次都复制粘贴我的功能,可能存在某种方式使用它像全局函数或其他解决方法。

4 个答案:

答案 0 :(得分:1)

您可以使用继承(从一个提供所需__str__方法的基类继承您的不同类。)

或者,如果这对您不起作用,并且您只想以最简单的方式共享此方法实现,则可以在类中分配方法而不是定义方法。

def mystrfunction(self):
   return whatever

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

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

答案 1 :(得分:0)

在外面,定义一个函数,

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

答案 2 :(得分:0)

如果您的课程只使用相同的方法,您可以使用mixin:

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):
    # ...

答案 3 :(得分:0)

继承:

class MyBaseModel(models.Model):
    ...
    def __str__(self):
        ...
class FirstModel(MyBaseModel):
    ...
class SecondModel(MyBaseModel):
    ...
    def __str__(self):  # you can adjust the inherited method 
        retval = super().__str__()
        return retval + ' ' + self.fld10