我可以在 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_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:
<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}'
然后在Buyer
和Seller
模型中混合:
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)
我想定义一个@属性一次并在两个不同的模型上使用它。这可能吗?
示例:
假设我有两个模型,卖家和买家:
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_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:
<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}'
然后在Buyer
和Seller
模型中混合:
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)