django nonrel's documentation指出:“您必须手动编写用于合并多个查询(JOIN,select_related()等)结果的代码”。如何使用google-appengine和django-nonrel来模拟'select_related'?
有人能指向我手动添加相关数据的任何代码片段吗? @nickjohnson有一个excellent post显示如何用直接的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: 伊克...我想通了什么我的问题。
我试图提高django admin中changelist_view的效率。似乎上面的select_related逻辑在外键在我的'display_list'中时仍然会为结果集中的每一行生成额外的查询。但是,我将其归结为不同的东西。上面的逻辑不会产生多个查询(但如果你更接近模仿尼克约翰逊的方式,它会看起来更漂亮)。
问题是在ChangeList方法的第117行django.contrib.admin.views.main中有以下代码:result_list = self.query_set._clone()
。所以,即使我正确地覆盖了管理员中的查询集并选择了相关的东西,这个方法也触发了一个查询集的克隆,它不保留我为我的'select related'添加的模型的属性,导致比我开始时的页面加载效率更低。
不知道该怎么办,但选择相关的东西的代码就好了。