Документация django nonrel гласит: «Вы должны вручную написать код для объединения результатов нескольких запросов (JOINs, select_related () и т. Д.)».
Может ли кто-нибудь указать мне на фрагменты, которые вручную добавляют связанные данные? У @nickjohnson есть отличный пост , показывающий, как это сделать с прямыми моделями AppEngine, но я использую django-nonrel.
Для моего конкретного использования я пытаюсь получить UserProfiles со связанными с ними моделями пользователей. Это должны быть просто два простых запроса, а затем сопоставить данные.
Однако, используя django-nonrel, новый запрос запускается для каждого результата в наборе запросов. Как я могу получить доступ к связанным элементам в виде «select_related»?
Я пробовал это, но, похоже, не работает, как я ожидал. Глядя на статистику rpc, кажется, что он запускает запрос для каждого отображаемого элемента.
all_profiles = UserProfile.objects.all()
user_pks = set()
for profile in all_profiles:
user_pks.add(profile.user_id) # a way to access the pk without triggering the query
users = User.objects.filter(pk__in=user_pks)
for profile in all_profiles:
profile.user = get_matching_model(profile.user_id, users)
def get_matching_model(key, queryset):
"""Generator expression to get the next match for a given key"""
try:
return (model for model in queryset if model.pk == key).next()
except StopIteration:
return None
UPDATE:
Я ... я понял, в чем моя проблема.
Я пытался улучшить эффективность changelist_view в администраторе django. Казалось, что приведенная выше логика select_related все еще производит дополнительные запросы для каждой строки в наборе результатов, когда внешний ключ был в моем «display_list». Однако я проследил это до чего-то другого. Вышеприведенная логика не создает несколько запросов (но если вы более точно подражаете способу Ника Джонсона, это будет выглядеть намного красивее).
Проблема в том, что в django.contrib.admin.views.main на строке 117 внутри метода ChangeList есть следующий код: result_list = self.query_set._clone()
. Таким образом, хотя я правильно переопределил набор запросов в админке и выбрал связанный материал, этот метод вызывал клон набора запросов, который НЕ сохраняет атрибуты в модели, которые я добавил для моей «select related», в результате чего даже более неэффективная загрузка страницы, чем когда я начинал.
Пока не уверен, что с этим делать, но код, который выбирает связанные вещи, просто отлично.