大家好我开始使用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):
而且我不希望每次都复制粘贴我的功能,可能存在某种方式使用它像全局函数或其他解决方法。
答案 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