Evg*_*eny 15 django django-models
这似乎不适用于django 1.1(我相信这将需要一个子查询,因此标题)
qs.annotate(interest_level= \
Count(Q(tags__favoritedtag_set__user=request.user))
)
Run Code Online (Sandbox Code Playgroud)
我的查询集中有一些项目被标记,标签可以被用户收藏,我想计算用户通过标签在集合中偏好每个项目的次数.
有没有办法在不使用extra()的情况下构造这样的查询?
谢谢.
Ger*_*alt 10
查看其中的add_aggregate函数django/db/models/sql/query.py,查询对象将不被接受为输入值.
不幸的是,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)
Run Code Online (Sandbox Code Playgroud)
此外,您无法在通过定义的字段上注释查询集.extra().
可以views.py像这样进入SQL :
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})
Run Code Online (Sandbox Code Playgroud)
模板:
{% for item in qs %}
name: {{ item.name }}, level: {{ item.interest_level }}<br>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我使用MySQL5测试了这个.因为我不是SQL专家,所以我很好奇如何在这里进行优化,或者是否有另一种方法来"减少"SQL的数量.也许有一些有趣的方法可以related_name直接在SQL中使用这个功能?
| 归档时间: |
|
| 查看次数: |
8930 次 |
| 最近记录: |