【问题标题】:Can I use the same @property on multiple models in django?我可以在 django 的多个模型上使用相同的 @property 吗?
【发布时间】:2021-08-04 06:44:32
【问题描述】:

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

有没有办法只定义一次这个属性,但对两个模型都使用它?

【问题讨论】:

  • 是的,这是可能的。你可以定义一个 mixin,实现它并在你的模型上继承它

标签: django django-models django-admin


【解决方案1】:

您可以定义一个抽象模型,该模型可以定义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,所以:

class NameMixin:

    @property
    def display_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)

【讨论】:

  • 出于好奇,mixin 选项是否需要重新迁移?
  • @AndrewEinhorn:一般不会,因为这只是混入一个属性,模型本身不会改变,我们不会创建额外的字段等等。
【解决方案2】:

是的,你可以这样做:

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 

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 2019-05-18
    • 1970-01-01
    • 2020-09-14
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多