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

标签 python django

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

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

关于python - 如何最好地跨多个模型使用多个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56673957/

相关文章:

python - 通过python编译PySide资源

Python Lambda 函数和 ffmpeg 命令以及从 jpg 到 ts 文件的标准输出

python - 如何在 Python 网站中查找未使用的代码?

Django 链接 prefetch_related 和 select_related

python - 如何将数据库路由器添加到 Django 项目

python - 如何在循环中使用 numpy.dstack?

python - 为什么我的交换列表的两个元素的代码出错了?

python - 随机()在 python

python - Django:NoReverseMatch 不是有效函数

django - 无法在 Django 1.5 中使用自定义用户模型创建 super 用户