Фильтрация Queryset с использованием массива объектов GenericForeignKey - PullRequest
0 голосов
/ 27 мая 2011

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

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

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

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

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

association_object.context

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

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

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

Action.objects.filter(context__in = associations)

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 мая 2011
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!)

0 голосов
/ 27 мая 2011

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

# 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...