Ich habe ein Modell:
class Zone(models.Model):
name = models.CharField(max_length=128)
users = models.ManyToManyField(User, related_name='zones', null=True, blank=True)
Und ich muss einen Filter nach dem Vorbild von:
u = User.objects.filter(...zones contains a particular zone...)
Es muss ein Filter für den Benutzer sein und es muss ein einzelner Filterparameter sein. Der Grund dafür ist, dass ich einen URL-Querystring erstelle, um die Änderungsliste der Administratorbenutzer zu filtern:http://myserver/admin/auth/user/?zones=3
Es scheint einfach zu sein, aber mein Gehirn kooperiert nicht!
django
django-models
Andy Baker
quelle
quelle
User.objects.filter(zones__id=<id>)
oder nichtUser.objects.filter(zones__in=<id(s)>)
gut dafür?User.objects.filter(zones__in=<id(s)>)
User.objects.filter(zones__id__in=<id(s)>)
Antworten:
Ich wiederhole nur, was Tomasz gesagt hat.
Es gibt viele Beispiele für
FOO__in=...
Stilfilter in den Viele-zu-Viele- und Viele-zu-Eins- Tests. Hier ist die Syntax für Ihr spezifisches Problem:Bei der Arbeit mit Abfragesätzen wird überall die doppelte Unterstrichsyntax (__) verwendet .
quelle
...__in
Beispiele danach an# filtering on a few zones, by id
. Diese zeigen die Filterung nach mehreren IDs / Objekten (in diesem Fall). Geben Sie einfach die IDs / Objekte für Zone1, Zone3 und Zone10 ein, die Sie interessieren. Oder fügen Sie bei Bedarf eine vierte hinzu.Beachten Sie, dass Sie möglicherweise .distinct () hinzufügen möchten, wenn sich der Benutzer in mehreren in der Abfrage verwendeten Zonen befindet. Andernfalls erhalten Sie einen Benutzer mehrmals:
quelle
Eine andere Möglichkeit, dies zu tun, besteht darin, die Zwischentabelle durchzugehen. Ich würde dies im Django ORM folgendermaßen ausdrücken:
Es wäre schön, wenn es das
.values('user')
angegebene nicht benötigen würde , aber Django (Version 3.0.7) scheint es zu brauchen.Der obige Code generiert am Ende SQL, das ungefähr so aussieht:
Das ist schön, weil es keine Zwischenverknüpfungen gibt, die dazu führen könnten, dass doppelte Benutzer zurückgegeben werden
quelle