2016-09-19 7 views
0

Ich schreibe eine Django-App, die Gruppen von Benutzern definiert. Ein Benutzer kann Teil vieler Gruppen sein.Django: Wo soll ich Fragen über Benutzer stellen, der zu anderen Modellen in Beziehung steht?

Ich möchte in der Lage sein, aus einer Liste von Gruppen Benutzer abzurufen, die Mitglieder mindestens einer dieser Gruppen und ohne Duplikat sind.

Also schrieb ich eine Abfrage, um das zu erreichen. Diese Methode nimmt eine Liste von group_id und gibt einfach eine Liste von Benutzern zurück. Meine Frage ist: Wo ist der beste Ort, um diese Methode zu setzen?

Ich dachte daran, einen benutzerdefinierten Manager für mein Gruppenmodell zu erstellen. Aber es scheint nicht logisch, da meine Methode mir eine Liste von Benutzern zurückgeben wird.

Nach dem doc: https://docs.djangoproject.com/en/1.8/topics/db/managers/

-Manager eines Modells sollten Fragen zu diesem Modell enthält.

Nach einiger Recherche habe ich gesehen, dass es nicht ratsam ist, den django.auth.models.User Manager (zumindest in meinem Fall) zu erweitern.

Im Moment werde ich meine Methode einfach in eine 'service.py'-Datei schreiben, aber ich habe mich gefragt, ob es eine elegantere Art gibt, das zu erreichen, was ich zu tun versuche.

Vielen Dank für Ihre Vorschläge!

Antwort

0

Ich nehme an, es gibt eine ManyToManyField Beziehung von User bis Group, wie folgt?

class Group(models.Model): 
    users = models.ManyToManyField('auth.User') 

Ich glaube nicht ein Grund, es gibt eine Methode, dies zu erreichen, zu schreiben, es ist nur ein einzeiliger Aufruf filter:

User.objects.filter(groups__in=group_ids) 

Wenn Sie es ein Verfahren machen müssen, ich don Ich glaube nicht, dass es einen "offiziellen" Platz gibt, um das zu sagen. Der User Manager wäre wahrscheinlich am nächsten, aber wie Sie sagen, ist das Hinzufügen eines benutzerdefinierten Managers zu User ein Schmerz. Django-Apps sind nur Python-Code und sind nicht sehr vorschreibend dafür, wo Non-Framework-Methoden laufen, also setze sie dort hin, wo sie für deinen Code/dein Team sinnvoll sind.

Beachten Sie, dass Django already provides all of this functionality, und nennt sogar das Modell Group, so scheint es, als erfinden Sie das Rad neu zu schreiben.

+0

Danke für die Antwort. Tatsächlich habe ich bereits Benutzergruppen für die Erlaubnis verwendet. Meine Frage war mehr über die Konzeption und wo diese Art von Code. Meine App ist ein Newsletter und ich wollte mit einer Newsletter-Kampagne gezielt auf ganz bestimmte Nutzer abzielen. Aber du hast recht, ich kann es mit Django-Gruppen schaffen! :) – Jisson

0

In Ihrem views.py können Sie die unten Funktion verwenden und es aus Ihrer Sicht nennen:

def get_groups_users(*groups): 
    users = User.objects.filter(groups__name__in=list(groups)) 
    return list(set(users)) 
Verwandte Themen