假设我有这些模型和字段:
class User(AbstractBaseUser):
name_title
name_first
name_middle_initial
name_last
address_1
address_2
address_city
address_state
address_post_code
class Order(models.Model):
name_title
name_first
name_middle_initial
name_last
address_1
address_2
address_city
address_state
address_post_code
class Shipment(models.Model):
address_1
address_2
address_city
address_state
address_post_code
我们还可以说,这些模型都不一定相关 - 订单不一定属于用户,发货不一定属于订单,等等。
我希望所有重复字段都相同 - 具有相同的 verbose_name、validations、max_length 等。
我尝试过采用 mixin 方法:
class AddressFieldsMixin(models.Model):
address_1
address_2
address_city
address_state
address_post_code
class NameFieldsMixin(models.Model):
name_title
name_first
name_middle_initial
name_last
class User(AbstractBaseUser, AddressFieldsMixin, NameFieldsMixin):
pass
class Order(models.Model, AddressFieldsMixin, NameFieldsMixin):
pass
class Shipment(models.Model, AddressFieldsMixin):
pass
...但是如果我的 Mixin
类继承自 models.Model
,这会导致模型/继承冲突,如果不继承,则会导致“未知字段”错误。
在多个模型中重复使用“名称”字段和“地址”字段的正确方法是什么?谢谢!
最佳答案
你应该制作你的模型 abstract = True
[Django-doc] 。喜欢:
class AddressFieldsModel(models.Model):
address_1 = ...
address_2 = ...
address_city = ...
address_state = ...
address_post_code = ...
class <b>Meta</b>:
<b>abstract = True</b>
class NameFieldsModel(models.Model):
name_title = ...
name_first = ...
name_middle_initial = ...
name_last = ...
class <b>Meta</b>:
<b>abstract = True</b>
class User(AddressFieldsModel, NameFieldsModel, AbstractBaseUser):
pass
class Order(AddressFieldsModel, NameFieldsModel, models.Model):
pass
class Shipment(AddressFieldsModel, models.Model):
pass
由于这些模型也继承自 models.Model
,因此它们不是 mixins [wiki] ,或者至少不是非常严格的定义。此外,您应该将这些类放在第一位,因为它们继承自 models.Model
,如果您指定 models.Model
作为第一个祖先,这将导致 MRO 冲突。
正如文档所述,抽象模型旨在使字段和行为的继承变得更容易:
Abstract base classes are useful when you want to put some common information into a number of other models. You write your base class and put
abstract=True
in theMeta
class. This model will then not be used to create any database table. Instead, when it is used as a base class for other models, its fields will be added to those of the child class.
关于python - 如何最好地跨多个模型使用多个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56673957/