【问题标题】:How reuse __str__ function in models.py for each class model如何在 models.py 中为每个类模型重用 __str__ 函数
【发布时间】:2017-07-16 15:45:45
【问题描述】:

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

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

而且我不想每次都复制粘贴我的函数,可能存在某种方式来使用它,比如全局函数或解决它的其他方式。

【问题讨论】:

  • 欢迎来到 StackOverflow!

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


【解决方案1】:

继承:

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

【讨论】:

    【解决方案2】:

    如果你的类只共享相同的方法,你可以使用 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】:

      在外面,定义一个函数,

      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
      

      【讨论】:

      • 我使用了冗余版本。类似于if (a==b) return true; else return false;
      • @downvoter 虽然def __str__(self): return foo(self)没有错。
      【解决方案4】:

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

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

      def mystrfunction(self):
         return whatever
      
      class Class1(object):
         ...
         __str__ = mystrfunction
      
      class Class2(object):
         ...
         __str__ = mystrfunction
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-12
        • 2014-11-18
        • 1970-01-01
        • 2018-05-07
        • 2010-11-23
        • 2013-03-28
        • 2020-09-19
        • 1970-01-01
        相关资源
        最近更新 更多