2017-01-30 4 views
2

ich die folgenden drei Modelle:django 1.6 - bezogene Objekte verwandter Objekte erhalten

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) 

im Grunde können viele Berichte viele Regionen haben, und eine Region können viele Büros haben. Wie kann ich alle Büros in Bezug auf die Regionen meines Berichts in einer Abfrage abrufen?

Ich kann dies tun mit zwei Abfragen:

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

aber ich fühle mich muss es eine Möglichkeit geben, dies nur eine Abfrage in zu tun.

Ich weiß, wie das geht, wenn das eine Kette von Objekten war, die von ForeignKeys verbunden sind, aber ManyToManyField verwirrt mich ein wenig.

Update:

diese Weise Office.objects.filter(region__in=reportrequest.regions) funktioniert nicht.

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' 

Antwort

1

Diese

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

diese echt aussieht, aber nicht funktioniert. siehe Update oben – kurtgn

+0

Basierend auf Ihrer Ausnahme. Probieren Sie das aktualisierte. Habe das nicht getestet –

+0

yep das funktioniert - danke! – kurtgn

Verwandte Themen