我有一个下面的模型指向通用关系。这可以是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)
那么如何过滤通用关系?或者我该如何专门处理此异常?
答案 0 :(得分: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')
答案 1 :(得分:0)
我意识到这是一个古老的(ish)问题,但我想我会提供一种替代方法,以防其他人像我一样遇到这篇文章。
我没有对 ContentType 模型执行单独的 .get()
,而是将应用/模型名称合并到我的过滤器中,如下所示:
queryset = ReportedContent.objects.filter(
object_id=parent_object.id,
content_type__app_label=app_label,
content_type__model=model_name
)