कहो सेट मैं 2 मॉडल:Django ORM: संबंधित का चयन करना
class Poll(models.Model):
category = models.CharField(u"Category", max_length = 64)
[...]
class Choice(models.Model):
poll = models.ForeignKey(Poll)
[...]
एक पोल वस्तु देखते हुए, मैं अपने विकल्पों के साथ क्वेरी कर सकते हैं:
poll.choice_set.all()
लेकिन, क्वेरी करने के लिए एक उपयोगिता समारोह है मतदान के एक सेट से सभी विकल्प?
वास्तव में, मैं निम्नलिखित की तरह कुछ के लिए देख रहा हूँ (जो समर्थित नहीं है, और मैं इसे कैसे हो सकता है की मांग न करें):
polls = Poll.objects.filter(category = 'foo').select_related('choice_set')
for poll in polls:
print poll.choice_set.all() # this shouldn't perform a SQL query at each iteration
मैं एक (बदसूरत) समारोह मेरी मदद करने के लिए बनाया कि प्राप्त:
def qbind(objects, target_name, model, field_name):
objects = list(objects)
objects_dict = dict([(object.id, object) for object in objects])
for foreign in model.objects.filter(**{field_name + '__in': objects_dict.keys()}):
id = getattr(foreign, field_name + '_id')
if id in objects_dict:
object = objects_dict[id]
if hasattr(object, target_name):
getattr(object, target_name).append(foreign)
else:
setattr(object, target_name, [foreign])
return objects
जो इस प्रकार प्रयोग किया जाता है:
polls = Poll.objects.filter(category = 'foo')
polls = qbind(polls, 'choices', Choice, 'poll')
# Now, each object in polls have a 'choices' member with the list of choices.
# This was achieved with 2 SQL queries only.
वहाँ आसान पहले से ही कुछ पी है Django द्वारा rovided? या कम से कम, एक स्निपेट एक ही तरीके से एक बेहतर तरीके से कर रहा है।
आमतौर पर आप इस समस्या को कैसे संभालेंगे?
शायद आपका qbind फ़ंक्शन सबसे अच्छा किया जा सकता है। लेकिन इसे कस्टम प्रबंधक में पैकेज करने का अर्थ हो सकता है - http://docs.djangoproject.com/en/dev/topics/db/managers/#id2 – NathanD