Django独特的外键组合

New*_*wtt 3 python django

我有 4 个 Django 模型:

class KeyOne(models.Model):
    name = models.CharField(unique=True)

class KeyTwo(models.Model):
    name = models.CharField(unique=True)

class KeyThree(models.Model):
    name = models.CharField(unique=True)

class KeyList(models.Model):
    key_one = models.ForeignKey(KeyOne)
    key_two = models.ForeignKey(KeyTwo)
    key_three = models.ForeignKey(KeyThree)
    list = models.CharField()
Run Code Online (Sandbox Code Playgroud)

基本上,是与、和KeyList的不同组合相关联的关键字列表。如何确保在 Django 管理中只能输​​入唯一的组合?KeyOneKeyTwoKeyThree

Bok*_*tto 11

姜戈 > 2.2

Django 文档说

请改用带有约束选项的 UniqueConstraint。UniqueConstraint 提供比 unique_together 更多的功能。unique_together 将来可能会被弃用。

所以在你的情况下:

class KeyList(models.Model):
    key_one = models.ForeignKey(KeyOne)
    key_two = models.ForeignKey(KeyTwo)
    key_three = models.ForeignKey(KeyThree)
    list = models.CharField()
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["key_one", "key_two", "key_three"], name="all_keys_unique_together")
]
Run Code Online (Sandbox Code Playgroud)


bca*_*cap 5

您必须在 KeyList 的 Meta 类中设置:

class KeyList(models.Model):
    key_one = models.ForeignKey(KeyOne)
    key_two = models.ForeignKey(KeyTwo)
    key_three = models.ForeignKey(KeyThree)
    list = models.CharField()
    class Meta:
        unique_together = (("key_one", "key_two", "key_three"),)
Run Code Online (Sandbox Code Playgroud)