如何最好地跨多个模型使用多个字段?

2024-09-30 03:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这些模型和字段:

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

也可以说,这些模型都不一定相关——订单不一定属于用户,发货不一定属于订单,等等

我希望所有重复字段都相同——具有相同的详细名称、验证、最大长度等

我尝试过采用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,则会导致模型/继承冲突,如果不继承,则会导致“未知字段”错误

在多个型号中重复使用“名称”字段和“地址”字段的正确方法是什么?谢谢


Tags: name模型citymiddlemodeltitleaddressmodels
1条回答
网友
1楼 · 发布于 2024-09-30 03:24:08

你应该制作你的模型。比如:

class AddressFieldsModel(models.Model):
    address_1 = ...
    address_2 = ...
    address_city = ...
    address_state = ...
    address_post_code = ...

    class Meta:
        abstract = True

class NameFieldsModel(models.Model):
    name_title = ...
    name_first = ...
    name_middle_initial = ...
    name_last = ...

    class Meta:
        abstract = True

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 the Meta 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.

相关问题 更多 >

    热门问题