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)
इसके अलावा, आप .extra()
के माध्यम से परिभाषित क्षेत्रों पर एक क्वेरीसमूह व्याख्या नहीं कर सकते।
एक तो जैसे 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 की मात्रा को "कम करने" का कोई दूसरा तरीका है। शायद एसक्यूएल के भीतर सीधे related_name
सुविधा का उपयोग करने के लिए कुछ दिलचस्प तरीका है?
क्या आपको एक त्रुटि संदेश मिलता है? क्या आप उन मॉडलों को प्रदान कर सकते हैं जिनके साथ आप काम कर रहे हैं? – cethegeek
त्रुटि "अपवाद" क्यू 'ऑब्जेक्ट में कोई विशेषता नहीं है' विभाजन ', geradeausanwalt सही एकत्रीकरण funcs क्यू ऑब्जेक्ट्स तर्क के रूप में नहीं लेता है। उनके जवाब में मॉडल मेरे समान हैं। – Evgeny