2017-01-30 8 views
2

私は、次の3つのモデルがあります:ジャンゴ1.6 - 関連オブジェクトの関連オブジェクトを取得

class Region(models.Model): 
    code = models.IntegerField() 

class ReportRequest(models.Model): 
    # a report can include many regions 
    regions = models.ManyToManyField(Region) 

class Office(models.Model): 
    # an office belongs to one region 
    region = models.ForeignKey(Region) 

基本的には、多くの報告が多くの領域を持つことができ、1つの領域は、多くのオフィスを持つことができます。 レポートの地域に関連するすべてのオフィスを1つのクエリで取得するにはどうすればよいですか?

私は2つのクエリでこれを行うことができます。

region_pks = reportrequest.regions.values_list('id', flat=True) 
offices = Office.objects.filter(region_id__in=region_pks) 

が、私はちょうど1つのクエリでこれを行う方法がなければならないと感じ。

私はこれがForeignKeysによって接続されたオブジェクトのチェーンである場合、これを行う方法を知っていますが、ManyToManyFieldは私をちょっと混乱させます。

更新:

Office.objects.filter(region__in=reportrequest.regions)動作しませんこの方法。

reportrequest = ReportRequest.objects.first() 
print(Office.objects.filter(region__in=reportrequest.regions).all()) 

Traceback (most recent call last): 
    File "/Users/9999/_projects/declarator/transparency/transparency/scripts/process_report_requests.py", line 22, in <module> 
    print(Office.objects.filter(region__in=reportrequest.regions).all()) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/manager.py", line 92, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/query.py", line 691, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/modeltranslation/manager.py", line 338, in _filter_or_exclude 
    return super(MultilingualQuerySet, self)._filter_or_exclude(negate, *args, **kwargs) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/query.py", line 709, in _filter_or_exclude 
    clone.query.add_q(Q(*args, **kwargs)) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1287, in add_q 
    clause, require_inner = self._add_q(where_part, self.used_aliases) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1314, in _add_q 
    current_negated=current_negated, connector=connector) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1142, in build_filter 
    value, lookups = self.prepare_lookup_value(value, lookups, can_reuse) 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1047, in prepare_lookup_value 
    value = value() 
    File "/Users/9999/.virtualenvs/transparency/lib/python2.7/site-packages/django/db/models/fields/related.py", line 839, in __call__ 
    manager = getattr(self.model, kwargs.pop('manager')) 
KeyError: u'manager' 

答えて

1

この

offices = Office.objects.filter(region__in=reportrequest.regions.all()) 
+0

これは合法的に見えますが、動作しません。あなたの例外に基づいて、上記の更新を参照してください。 – kurtgn

+0

更新されたものを試してください。これをテストしていない –

+0

これはうまく動作します - ありがとう! – kurtgn

関連する問題