मैं निम्नलिखित मॉडल:रोकथाम हे (एन) मध्यस्थ मॉडल वाली क्वेरी
class Artist(models.Model):
name = models.CharField()
def primary_group(self):
return self.memberships.select_related('group').get(is_primary=True)
class Group(models.Model):
name = models.CharField()
members = models.ManyToManyField(Artist, through='Membership')
class Membership(models.Model):
artist = models.ForeignKey(Artist, related_name='memberships')
group = models.ForeignKey(Group)
is_primary = models.BooleanField()
Artist
और Group
एक मध्यस्थ के मॉडल, Membership
के माध्यम से जुड़े हुए हैं। कलाकारों के पास केवल एक प्राथमिक समूह हो सकता है, जिसे is_primary
, मान्य, आदि के माध्यम से चिह्नित किया गया है।
एक टेम्पलेट में जहां मैं कलाकारों को सूचीबद्ध करता हूं, मैं उपरोक्त विधि द्वारा बुलाए गए अपने प्राथमिक समूह के अलावा मूल कलाकार जानकारी सूचीबद्ध करता हूं। हालांकि, यह एक ओ (एन) ऑपरेशन है और मेरे पास ऐसा करने के लिए 160 कलाकार हैं। एसक्यूएल कि Django-डिबग-उपकरण पट्टी प्रदान करता है इस प्रकार है:
SELECT ••• FROM "people_membership"
LEFT OUTER JOIN "people_group" ON ("people_membership"."group_id" = "people_group"."id")
WHERE ("people_membership"."artist_id" = xx AND "people_membership"."is_primary" = true)
मुझे जोड़ने कि इस सूचीबद्ध हर कलाकार के लिए होता है, तो मैं इनमें से 160 के बारे में मिलता है।
क्या ओ (एन) सबसे अच्छा किया जा सकता है, क्योंकि मैं मॉडल विधि कहता हूं? या क्या ऐसा कुछ और है जो मैं इसे सुधारने के लिए कर सकता हूं (primary_group
denormalizing से कम)? यह किसी भी प्रकार की जानकारी के साथ एक समस्या है जो एक मध्यस्थ मॉडल में संग्रहीत है जिसे मैं स्रोत या लक्ष्य से कॉल करना चाहता हूं।
बहुत यकीन है कि यह अब ज्यादातर सही है :) –