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'
diese echt aussieht, aber nicht funktioniert. siehe Update oben – kurtgn
Basierend auf Ihrer Ausnahme. Probieren Sie das aktualisierte. Habe das nicht getestet –
yep das funktioniert - danke! – kurtgn