如何在Django中添加带有通用外键的unique_together

时间:2016-05-03 10:38:52

标签: python django generics django-models django-generic-relations

我不确定在使用Django中的GenericForeign Relations时处理唯一约束时我做错了还是有问题。

当我尝试保存对象时(例如在Admin中),我在表单数据库中获得了唯一约束错误(引发500),但在管理员(UI)上没有ValidationError。

以下是我的代码段

我有一个通用关系模型,如下所示,

class Targeting(models.Model):

    TARGETING_CHOICES = (
        ('geo', "Geo targeting"),
        ('other', "Other targeting"),
    )

    targeting_type = models.CharField(max_length=64, choices=TARGETING_CHOICES, null=False)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()

    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        unique_together = ('content_type', 'object_id', 'targeting_type')

我使用它的其他模型是,

class MyModel(models.Model):
    name = models.CharField(max_length=60, db_index=True)
    targeting = GenericRelation('Targeting')

异常提升:

duplicate key value violates unique constraint "mymodel_targeting_targeting_type_0dff10ee_uniq" DETAIL: Key (targeting_type, content_type_id, object_id)=(geo, 18, 188) already exists.

我实施它的方式有问题吗?或者其他东西不是这样用的?

非常感谢任何形式的帮助。感谢

1 个答案:

答案 0 :(得分:0)

您在这里没有收到ValidationError,因为它无法在没有其他查询的情况下进行验证,并且django无法自行创建该查询。如果您需要进行验证,则需要自己编写。