Фильтр Django для родовых отношений (исключение уникального ограничения)

У меня есть модель ниже, которая указывает на общие отношения. Это может быть 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')

Я хотел бы проверить, существует ли content_object, прежде чем я получу duplicate key value violates unique constraint исключение.

В документации Django упоминается, что:

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

Итак, как я могу отфильтровать родовые отношения? или как мне конкретно разобраться с этим исключением?

2 ответа

Вы можете фильтровать по 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')

Я понимаю, что это старый вопрос, но я подумал, что предлагаю альтернативный метод на случай, если другие наткнутся на этот пост, как и я.

Вместо того, чтобы делать отдельный .get() в модели ContentType я просто включаю имена приложений / моделей в свой фильтр, например:

      queryset = ReportedContent.objects.filter(
               object_id=parent_object.id,
               content_type__app_label=app_label,
               content_type__model=model_name
           )
Другие вопросы по тегам