#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. Не могли бы вы обновить свой вопрос и включить код для ваших моделей? Не все, а только те биты, в которых вы определяете взаимосвязи.