、クエリオブジェクトは、入力値として受け付けられません。
は残念ながら、特に、現在、さらに何らかの形で濾過される1クエリセットに相当するものに注釈を付ける/集約するジャンゴ内には直接的な方法はありません。
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()
経由で定義されたフィールド上のクエリセットに注釈をつけることができません。次のモデルを想定し
。
一つは、そうのよう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})
は、テンプレート:
{% for item in qs %}
name: {{ item.name }}, level: {{ item.interest_level }}<br>
{% endfor %}
私はのMySQL5を使用して、これをテストしました。私はSQLのエキスパートではないので、ここで最適化する方法や、SQLの量を減らす別の方法があるかどうか不思議です。たぶん、related_name
機能をSQL内で直接利用する興味深い方法がありますか?
エラーメッセージが表示されますか?あなたが働いているモデルを提供できますか? – cethegeek
エラーがgeradeausanwaltが右集約のfuncsは、引数としてQオブジェクトを取ることはありませんで、「例外 『Q』オブジェクトが 『スプリット』を何の属性を持っていない」です。彼の答えのモデルは私のものに似ています。 – Evgeny