我可以在django的多个模型上使用相同的@property吗?



我想定义一个@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_namelast_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}'

,然后在BuyerSeller模型中混合:

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 

相关内容

  • 没有找到相关文章

最新更新