2017-11-18 1 views
0

möchte ich groups__name in einer Linie bei User.objects.values('id', 'username', 'groups__name')Wie bekomme ich groups__name in einer Zeile in der Django-Benutzermodellabfrage?

Aber ich bekomme Beispiel erhalten:

{'groups__name': None, 'id': 1, 'username': 'admin'}, 
{'groups__name': 'Manager', 'id': 2, 'username': 'test'}, 
{'groups__name': 'Personal', 'id': 2, 'username': 'test'} 

I abgefragt werden soll wie in diesem Beispiel:

{'id': 1, 'groups__name': None, 'username': 'admin'}, 
{'id': 2, 'groups__name': ('Manager', 'Personal'), 'username': 'test'} 

ich django 1.11

+0

Sie fehlen ein einzelnes Zitat nach "groups__name" in der ersten Zeile, ist das in Ihrem Code auch? –

+0

Nein. Ich habe es hier falsch geschrieben. Es tut uns leid. Ich werde bearbeiten. –

+1

in einer einzigen Abfrage können Sie es nicht tun –

Antwort

0

Ihre Abfrage ist korrekt, aber die Ergebnisse müssen auch in Python danach manipuliert werden, um alle verwandten Namen in einer Zeile als Tupel zu erhalten. Die Funktion itretools.groupby erwartet, dass ein iterierbarer Parameter nach der Funktion key sortiert wird (d. H. Extrahierte Objekte von Benutzerobjekten ohne Elemente, die sich auf die Gruppe beziehen).

from itertools import groupby 

qs = (User.objects.values('id', 'username', 'groups__name') 
     .order_by('username', 'id', 'groups__name') 
    ) 
qs_list = [] 

for key, gr in groupby(qs, key=lambda x: 
         tuple((k, v) for k, v in x.items() if k != 'groups__name')): 
    groups__name = tuple(x['groups__name'] for x in gr if x['groups__name'] is not None) 
    qs_list.append(dict(key + (('groups__name', groups__name or None),))) 

Fußnoten:
Der Primärschlüssel ist in order by nicht wichtig, aber ich hinzugefügt, weil Sie nichts über das Modell geschrieben hat. Ich erwartete django.contrib.auth.models oder etwas mit ManyToMany-Beziehung zwischen Benutzer und Gruppe und Attribut Group.name.null == False, andernfalls muss ein zusätzliches Nicht-Null-Feld (wie pk) auch verwendet werden, um einen Nullwert von fehlenden verwandten Objekten zu unterscheiden.

+0

Vielen Dank. Es funktionierte. Ich werde diese Idee immer verwenden. –

Verwandte Themen