我可以在 Django 的多个模型上使用相同的 @属性 吗?

Can I use the same @property on multiple models in django?

我想定义一个@属性一次并在两个不同的模型上使用它。这可能吗?

示例:

假设我有两个模型,卖家和买家:

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}"

有没有办法只定义一次 属性,然后将其用于两个模型?

是的,你可以这样做:

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 

您可以定义一个 abstract 模型,它可以定义 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:
        <strong>abstract = True</strong>

然后制作两个具体模型:

class Buyer(<strong>Trader</strong>):
    pass

class Seller(<strong>Trader</strong>):
    pass

因此,我们不仅继承了 属性,还继承了模型字段。


如果不想继承字段,可以实现mixin,所以:

class <strong>NameMixin</strong>:

    @property
    def <strong>display_name</strong>(self):
        return f'{self.first_name} {self.last_name}'

然后在BuyerSeller模型中混合:

class Seller(<strong>NameMixin</strong>, models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

class Buyer(<strong>NameMixin</strong>, models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)