2

我有一个模型,它指向一个通用关系。这可以是一个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)

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

4

2 回答 2

0

object_id您可以按和过滤content_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')
于 2019-05-24T18:16:06.457 回答
0

我意识到这是一个古老的(ish)问题,但我想我会提供一种替代方法,以防其他人像我一样遇到这篇文章。

我没有在 ContentType 模型上单独做一个.get(),而是将应用程序/模型名称合并到我的过滤器中,如下所示:

queryset = ReportedContent.objects.filter(
               object_id=parent_object.id,
               content_type__app_label=app_label,
               content_type__model=model_name
           )
于 2021-02-26T08:27:49.443 回答