猿问

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

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


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

假设这些模型中没有一个是必然相关的——订单不一定属于用户,发货不一定属于订单,等等。


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


我尝试过采用混合方法:


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“未知字段”错误。


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


红糖糍粑
浏览 121回答 1
1回答

aluckdog

您应该制作模型abstract = True[Django-doc]。喜欢:class AddressFieldsModel(models.Model):    address_1 = ...    address_2 = ...    address_city = ...    address_state = ...    address_post_code = ...    class Meta:        abstract = Trueclass NameFieldsModel(models.Model):    name_title = ...    name_first = ...    name_middle_initial = ...    name_last = ...    class Meta:        abstract = Trueclass User(AddressFieldsModel, NameFieldsModel, AbstractBaseUser):    passclass Order(AddressFieldsModel, NameFieldsModel, models.Model):    passclass Shipment(AddressFieldsModel, models.Model):    pass由于这些模型也继承自models.Model,因此它们不是mixins [wiki],或者至少不是非常严格的定义。此外,您应该将这些类放在首位,因为它们继承自models.Model,并且如果您指定models.Model为第一个祖先,这将导致 MRO 冲突。正如文档所述,抽象模型旨在使字段和行为的继承更容易:当您想将一些公共信息放入许多其他模型中时,抽象基类很有用。你写你的基类并放入类abstract=True中Meta。该模型将不会用于创建任何数据库表。相反,当它用作其他模型的基类时,它的字段将添加到子类的字段中。
随时随地看视频慕课网APP

相关分类

Python
我要回答