【问题标题】:Django: Foreign key relation depending on choiceDjango:外键关系取决于选择
【发布时间】:2012-10-01 12:36:48
【问题描述】:

在Django中,有没有办法在模型之间创建如下动态关系?

 class ClothingMale(models.Model):
     # male specific fields

 class ClothingFemale(models.Model):
     # female specific fields

 class Person(models.Model):
    gender = models.IntegerField(max_length=2, choices=GENDER_CHOICES, blank=True)
    clothes = models.ForeignKey(???)

我正在为 Person 使用 ModelForm。表单内的衣服字段应根据选择的性别动态变化。我知道 GenericForeignKeys,但我想知道是否有更好的方法来解决这个问题?

【问题讨论】:

    标签: django model foreign-keys


    【解决方案1】:

    恕我直言,这是数据库设计的问题;我会选择PersonClothing 超类并使用MalePersonClothingFemalePersonClothing 对其进行子类化。 PersonClothing 超类将是 Django abstract base class;一个特定的类当您想将一些通用信息放入许多其他模型时很有用

    为此,只需在模型的meta 中指定以下选项:

    class Meta:
        abstract = True
    

    【讨论】:

    • 好的,但我将如何创建动态关系? Clothing* 的外键取决于运行时在表单中选择的性别。我将如何建模?
    • @'Josvic Zammit' 是的,它是一个 ModelForm。
    • @mzu 唯一能想到的办法就是提前指定性别(初步看法);这将导致不同的形式(每种类型的模型生成)。
    • @'Josvic Zammit' 好的,谢谢,我会看看我是否可以通过这种方式解决问题。
    • 是的,谢谢,我基本上检查了视图中的性别,并分别使用了 StaffMaleClothesForm 和 StaffFemaleClothesForm。这些模型与 Person 具有 OneToOne 关系,但我最终没有使用抽象模型,因为在这种情况下没有公共字段。
    【解决方案2】:

    一种选择是使用GenericForeignKey。这当然有 int 的缺点,例如你不能在 GenericForeignKey 上使用 filter()

    另一个选择是使用model inheritance,它也有很多陷阱。

    【讨论】:

      猜你喜欢
      • 2017-05-14
      • 2018-12-14
      • 2014-03-15
      • 1970-01-01
      • 2016-07-29
      • 2021-06-02
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多