查看django/db/models/sql/query.py
中的add_aggregate
函數,查詢對象將不會被接受爲輸入值。
不幸的是,在Django中目前沒有直接的方式來聚合/註釋什麼相當於一個查詢集,特別是沒有一個額外的過濾器。
假設以下型號:
class Item(models.Model):
name = models.CharField(max_length=32)
class Tag(models.Model):
itemfk = models.ForeignKey(Item, related_name='tags')
name = models.CharField(max_length=32)
class FavoritedTag(models.Model):
user = models.ForeignKey(User)
tag = models.ForeignKey(Tag)
而且,你不能批註通過.extra()
定義的字段的查詢集。
人們可以拖放到SQL中views.py
像這樣:
from testing.models import Item, Tag, FavoritedTag
from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from django.utils.datastructures import SortedDict
@login_required
def interest_level(request):
ruid = request.user.id
qs = Item.objects.extra(
select = SortedDict([
('interest_level', 'SELECT COUNT(*) FROM testing_favoritedtag, testing_tag \
WHERE testing_favoritedtag.user_id = %s \
AND testing_favoritedtag.tag_id = testing_tag.id \
AND testing_tag.itemfk_id = testing_item.id'),
]),
select_params = (str(ruid),)
)
return render_to_response('testing/interest_level.html', {'qs': qs})
模板:
{% for item in qs %}
name: {{ item.name }}, level: {{ item.interest_level }}<br>
{% endfor %}
我測試了使用MySQL5的。因爲我不是SQL專家,所以我很好奇如何在這裏優化,或者如果有另一種方法來「減少」SQL的數量。也許有一些有趣的方式直接在SQL中使用related_name
功能?
您是否收到錯誤訊息?你能提供你正在使用的模型嗎? – cethegeek 2009-12-05 04:35:38
錯誤是「異常」Q「對象沒有屬性」分裂「」,geradeausanwalt是正確的聚合funcs不採取Q對象作爲參數。他的答案中的模型與我的相似。 – Evgeny 2009-12-06 19:57:20