2012-02-25 3 views
1

에 의해 객체를 얻는 것은 이제 우리는 다음과 같은 모델을 가지고 가정하자) 하나만 Zomg 개체가 있습니다.장고는 관련 분야 'ID를

내 프로젝트에서는 수천 개의 Zomg 레코드를 수시로 업데이트해야하므로 레코드를 찾는 것이 중요합니다. 그러나

>>> 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 

, 객체가 foo_id 인스턴스화 및 bar_id 액세스 꽤 많이 있습니다 :

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

가 지금은 강제하고있어 문제는 그냥 Zomg.objects.get() 방법 foo_idbar_id을 통과 할 수 없다는 것입니다 FooBar 개체를 먼저 가져온 다음 필요한 Zomg 개체를 가져와 두 개의 불필요한 데이터베이스 쿼리를 만듭니다.

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

질문에 대해서는 관련 필드의 ID로 Zomg 개체를 어떻게 얻을 수 있습니까?

답변

1

이 시도 : z = models.Zomg.objects.get(foo__id=1, bar__id=1)

+0

는 너무 쉽게 감사하고 매력처럼 작동합니다! 너무 나빠서 나 자신을 알아낼 수 없었다. –

+0

설명합니다. django에서는'__' 구문을 사용하여 하위 모델에 액세스 할 수 있습니다. foo 자체는 Foo 모델 그 자체가 아닌 Foo 모델에 대한 참조입니다. Foo 모델 자체의 일부에 액세스하려면'foo__' 구문을 사용하십시오. 그래서 당신은 단순히'foo__name = 'Joe'에 의해 이름으로 검색 할 수 있습니다. – platinummonkey