Django 对泛型关系的过滤(唯一约束异常)

Django filter on generic relationship (unique constraint exception)

我在下面有一个模型指向一般关系。这可以是 Post 对象或 Reply 对象。

class ReportedContent(models.Model):

    reporter = models.ForeignKey(User, on_delete=models.CASCADE)

    # Generic relation for posts and replies
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

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

我想在收到 duplicate key value violates unique constraint 异常之前检查 content_object 是否已经存在。

Django 文档提到:

# This will fail
>>> ReportedContent.objects.filter(content_object=content)
# This will also fail
>>> ReportedContent.objects.get(content_object=content)

那么我如何过滤通用关系?或者我该如何具体处理这个异常?

您可以按 object_idcontent_type 进行筛选。 只要确保你做对了, 通过这种方式获得 content_type

from django.contrib.contenttypes.models import ContentType
# ...

content_type = ContentType.objects.get(app_label='name_of_your_app', model='model_name')

用于处理异常:

if ReportedContent.objects.filter(object_id=content.id,content_type=content_type):
    raise Exception('your exception message')

我意识到这是一个老问题,但我想我会提供一种替代方法,以防其他人 运行 像我一样穿过这个 post。

我没有在 ContentType 模型上单独 .get(),而是将 app/model 名称合并到我的过滤器中,如下所示:

queryset = ReportedContent.objects.filter(
               object_id=parent_object.id,
               content_type__app_label=app_label,
               content_type__model=model_name
           )