我想定义一个@property一次,并在两个不同的模型上使用它。这可能吗?
的例子:
假设我有两个模型,卖方和买方:
class seller(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
class buyer(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
我希望为django管理界面添加一个属性来显示两个模型:
@property
def display_name(self):
return f"{first_name} {last_name}"
是否有一种方法来定义这个属性一次,但使用它的两个模型?
您可以定义一个抽象模型,该模型可以定义first_name
和last_name
字段以及属性:
class Trader(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
@property
def display_name(self):
return f'{self.first_name} {self.last_name}'
class Meta:
abstract = True
,然后用它做两个具体的模型:
class Buyer(Trader):
pass
class Seller(Trader):
pass
在这里,我们不仅继承了属性,还继承了模型字段。
如果你不想继承这些字段,你可以实现一个mixin,所以:
classNameMixin:
@property
defdisplay_name(self):
return f'{self.first_name} {self.last_name}'
,然后在Buyer
和Seller
模型中混合:
class Seller(NameMixin, models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
class Buyer(NameMixin, models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
是的,你可以这样做:
class Base(models.Model): # Make it abstract to avoide repeating code
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
@property
def display_name(self):
return f"{self.first_name} {self.last_name}"
class Meta:
abstract = True
然后像这样继承
class seller(Base):
pass
class buyer(Base):
pass