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_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')
我意识到这是一个老问题,但我想我会提供一种替代方法,以防其他人 运行 像我一样穿过这个 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
)
我在下面有一个模型指向一般关系。这可以是 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_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')
我意识到这是一个老问题,但我想我会提供一种替代方法,以防其他人 运行 像我一样穿过这个 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
)