を設定するには、私は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.
は簡単に何かがすでにPありDjangoによってrovided?少なくとも、より良い方法で同じことをするスニペット。
この問題は通常どのように処理しますか?
おそらく、qbind関数を実行することができます。しかし、それはカスタムマネージャーでパッケージ化する意味があるかもしれません - http://docs.djangoproject.com/en/dev/topics/db/managers/#id2 – NathanD