2013-08-26 3 views
1

У меня есть 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 не поле базы данных.

ответ

1

Если вы хотите, чтобы эти ActivityLog экземпляры были удалены в каскаде, вы можете сделать это, установив GenericRelation на объекты, на которые указывает. Из documentation:

Заметим также, что при удалении объекта, который имеет GenericRelation, любые предметы, имеющие GenericForeignKey, указывающие на него, будут удалены, а также.

+1

После публикации этого вопроса на SO и после более глубоких исследований и испытаний я нашел именно тот ответ, который вы даете в качестве правильного пути. Следует отметить два момента: 1) Если модель, содержащая «GenericForeignKey», ссылается на заостренную модель с помощью обычного «ForeignKey», вы должны установить «родственное имя» в «GenericForeignKey» или отключить его с помощью «+». 2) Вы можете определить «GenericRelation» в абстрактных моделях, нет никакой проблемы, как противоположность определения отношений (в этом случае вы должны правильно установить 'related_name', как описано в документах). Благодаря! – Caumons

+1

@Caumons Рад это услышать, спасибо за дополнительное разъяснение. –

 Смежные вопросы

  • Нет связанных вопросов^_^