2012-02-25 7 views
1

でオブジェクトを取得するのは、我々は次のモデルを持っていると仮定しましょう)にはZomgオブジェクトが1つしかありません。Djangoはその関連分野のID

私のプロジェクトでは、数千件のZomgレコードを時折更新する必要があるため、レコードを見つける効率が重要です。オブジェクトがインスタンス化されたときにfoo_idbar_idはかなりアクセス可能な、しかし

>>> z = models.Zomg.objects.get(foo_id=1, bar_id=1) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 132, in get 
    return self.get_query_set().get(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 341, in get 
    clone = self.filter(*args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 550, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude 
    clone.query.add_q(Q(*args, **kwargs)) 
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1194, in add_q 
    can_reuse=used_aliases, force_having=force_having) 
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1069, in add_filter 
    negate=negate, process_extras=process_extras) 
    File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1260, in setup_joins 
    "Choices are: %s" % (name, ", ".join(names))) 
FieldError: Cannot resolve keyword 'foo_id' into field. Choices are: bar, foo, id 

>>> z.foo_id 
1 
>>> z.bar_id 
1 

今、私はに強制てる問題は、私はちょうどZomg.objects.get()方法にfoo_idbar_idを渡すことができないということですFooBarオブジェクトを最初に取得し、必要なZomgオブジェクトを取得するためにそれらを使用して、2つの不要なデータベースクエリを作成します。

>>> f = models.Foo.objects.get(id=1) 
>>> b = models.Bar.objects.get(id=1) 
>>> z = models.Zomg.objects.get(foo=f, bar=b) 

質問にはどうすればZomgオブジェクトを関連フィールドのIDで取得できますか?

答えて

1

はこれを試してみてください: z = models.Zomg.objects.get(foo__id=1, bar__id=1)

+0

はとても簡単で、魔法のように動作し、ありがとうございます!あまりにも自分自身がそれを理解できなかったことは悪いです。 –

+0

説明してください。 djangoでは '__'構文を使ってサブモデルにアクセスすることができます。 foo自体はFooモデル自体ではなく、Fooモデルへの参照です.Fooモデル自体の部分にアクセスするには、 'foo__'構文を使用します。だから、単純に 'foo__name = 'Joe''で検索することができます – platinummonkey

関連する問題