为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红糖糍粑 2022-03-09 20:14:15
假设我有这些模型和字段:class User(AbstractBaseUser):    name_title    name_first    name_middle_initial    name_last    address_1    address_2    address_city    address_state    address_post_codeclass Order(models.Model):    name_title    name_first    name_middle_initial    name_last    address_1    address_2    address_city    address_state    address_post_codeclass 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_codeclass NameFieldsMixin(models.Model):    name_title    name_first    name_middle_initial    name_lastclass User(AbstractBaseUser, AddressFieldsMixin, NameFieldsMixin):    passclass Order(models.Model, AddressFieldsMixin, NameFieldsMixin):    passclass Shipment(models.Model, AddressFieldsMixin):    passMixin...但是如果我的类继承自,这会导致模型/继承冲突,如果不继承,则会导致models.Model“未知字段”错误。在多个模型中重复使用“名称”字段和“地址”字段的正确方法是什么?谢谢!
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

您应该制作模型abstract = True[Django-doc]。喜欢:


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=True中Meta。该模型将不会用于创建任何数据库表。相反,当它用作其他模型的基类时,它的字段将添加到子类的字段中。


查看完整回答
反对 回复 2022-03-09
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信