Фильтрация набора запросов с использованием массива объектов GenericForeignKey

#python #django #orm

#python #django #orm

Вопрос:

Вот в чем проблема.

У меня есть таблица, содержащая записи, которые связывают пользователя с объектом, который определяется GenericForeignKey

Я могу получить список этих объектов как таковых:

 association_objects = Association.objects.filter(user = request.user)
  

Это вернет массив объектов, и я смогу получить доступ к связанному объекту с помощью

 association_object.context
  

Таким образом, я могу легко создать массив только из контекстных объектов

ТЕПЕРЬ мне нужно запросить ВСЕ записи другой таблицы, которые связаны с любым из объектов в вышеупомянутом ассоциативном массиве.

В хорошей и святой вселенной я мог бы сделать что-то вроде

 Action.objects.filter(context__in = associations)
  

где контекст в этой таблице ТАКЖЕ является GenericForeignKey

Однако GFK не могут быть отфильтрованы по их фактическому ключевому свойству. Вы должны фильтровать как по типу контента, так и по первичному ключу одновременно…

Как, черт возьми, мне это сделать? Единственной моей блестящей идеей было разделить content_type и id на два отдельных массива и выполнить __in filters для обоих свойств, но не похоже, что это действительно сработает.

У кого-нибудь есть какие-нибудь яркие идеи?

Комментарии:

1. Вы когда-нибудь находили ответ на это? Мне это тоже нужно!

Ответ №1:

 from django.contrib.contenttypes.models import ContentType

ct = ContentType.objects.get_for_model(Action)
action_ids = association_objects.values_list("object_id", flat=True)
                                .filter(content_type=ct)
actions = Action.objects.filter(pk__in=action_ids)
  

(предполагая, что ваш GenericForeignKey состоит из content_type и object_id !)

Ответ №2:

Попробуйте это:

 # I assume that association_objects is a QuerySet
association_ids = association_objects.value_list("id", flat=True)
content_type = ContentType.objects.get_for_model(Association)
actions = Action.objects.filter(content_type=content_type,
                                object_id__in=association_ids)
  

Комментарии:

1. но content_type может быть переменной, если я правильно понимаю. Объектами, которые связаны, могут быть любые модели в БД

2. Да, content_type может ссылаться на любую модель. Но в вашем случае вам нужно выбрать только Association s, верно? PS. Я только что исправил свой ответ (2-я строка).

3. нет, возможно, я недостаточно четко сформулировал вопрос (просто думал вслух). Ассоциации связаны с любым объектом с помощью GFK … а из GFK — с действиями…. Представьте ассоциации как таблицу компоновщика между пользователем и действиями. Мне нужно использовать ассоциации в качестве моста от пользователя к действию на основе любого необходимого контекста объекта (любой модели в БД)

4. Не могли бы вы обновить свой вопрос и включить код для ваших моделей? Не все, а только те биты, в которых вы определяете взаимосвязи.