У меня есть Django модели ActivityLog
, который определяет общий внешний ключ со следующими полями:Исключить нулевые объекты GenericForeignKey из Джанго запроса
model_type = models.ForeignKey(ContentType, verbose_name=_("Object type"))
object_id = models.PositiveIntegerField(_("Object id"))
object = generic.GenericForeignKey('model_type', 'object_id')
Мне нужно фильтровать ActivityLog
экземпляры которых связаны object
не был удален (это не один). Django не делает на каскаде delete в GenericForeignKey
, и мне нужно исключить эти нежелательные записи из поиска. Есть ли простой, стандартный и эффективный способ сделать это?
В прекрасном мире, я бы использовать что-то вроде:
real_activity_logs = ActivityLog.objects.filter(object__isnull=False)
Но это не работает, как object
не поле базы данных.
После публикации этого вопроса на SO и после более глубоких исследований и испытаний я нашел именно тот ответ, который вы даете в качестве правильного пути. Следует отметить два момента: 1) Если модель, содержащая «GenericForeignKey», ссылается на заостренную модель с помощью обычного «ForeignKey», вы должны установить «родственное имя» в «GenericForeignKey» или отключить его с помощью «+». 2) Вы можете определить «GenericRelation» в абстрактных моделях, нет никакой проблемы, как противоположность определения отношений (в этом случае вы должны правильно установить 'related_name', как описано в документах). Благодаря! – Caumons
@Caumons Рад это услышать, спасибо за дополнительное разъяснение. –