2010-12-31 14 views
3

Zunächst einmal, ich plane auf mein Projekt auf Google App-Engine zu laufen, so dass ich djangoappengine verwende, die soweit ich weiß nicht unterstützt ManyToManyField django Typ. Aufgrund dieser Ich habe mein Setup Modelle wie folgt aus:Proper Weg zum Hinzufügen von Datensatz zu vielen zu vielen Beziehung in Django

from django.db import models 
from django.contrib.auth.models import User 

class Group(models.Model): 
    name = models.CharField(max_length=200) 

class UserGroup(models.Model): 
    user = models.ForeignKey(User) 
    group = models.ForeignKey(Group) 

Auf einer Seite habe ich ein Formularfeld, wo die Menschen einen Gruppennamen eingeben. Ich möchte, dass die Ergebnisse aus diesem Formularfeld ein UserGroup-Objekt für die Benutzergruppenkombination erstellen und, falls die Gruppe noch nicht existiert, ein neues Group-Objekt erstellen. Zuerst habe ich begonnen, diese Logik in die UserGroup-Klasse mit einer add_group-Methode zu überführen, aber ich erkannte schnell, dass es keinen Sinn macht, dies in die Klasse UserGroup zu schreiben. Was wäre der richtige Weg, dies zu tun? Ich habe einiges über Modellmanager gesehen. Ist es das wozu?

Antwort

3

Vom Django docs:

Ein Manager ist die Schnittstelle, über die Datenbankabfrageoperationen zur Verfügung gestellt werden, um Django Modelle

So ein Manager nicht der Weg ist, neue Instanzen eines Modells zu erstellen.

Ich hätte nur einen Konstruktor für das Group Modell, das die User zieht (wenn es gegeben wird) aus den Schlüsselwortargumenten und erstellt eine neue .

Also, wenn Sie einen neuen Group als Group(name='group name', user=some_user) instanziiert der Konstruktor könnte das user Stichwort Argument abstreifen und erstellen Sie die entsprechenden UserGroup mit, dass user:

class Group(models.Model): 
    name = models.CharField(max_length=200) 

    def __init__(self, *args, **kwargs): 
     # Remove user from the kwargs. 
     # It is important that user is removed from the kwargs before calling 
     # the super.__init__(). This is because the `user` kwarg is not expected. 
     user = kwargs.pop('user', None) 

     # call the normal init method 
     super(Group, self).__init__(*args, **kwargs) 

     # Create the UserGroup instance for the specified user 
     if user is not None: 
      # Maybe some other logic here ... 
      UserGroup(user=user, group=self).save() 

Auf diese Weise, wenn Sie ein user liefern, wenn Ihre Group instanziieren es erstellt ein UserGroup und wird nichts anderes tun.

Natürlich könnte man auch im Konstruktor des UserGroup Modells eine ähnliche Sache machen, es ist nicht wirklich so wichtig, es hängt nur davon ab, welcher metaphorisch Sinn für Ihren Code ergibt.

EDIT:

Ein Update auf die Probleme in den Kommentaren darauf hingewiesen:

... 
def __init__(self, *args, **kwargs): 
    ... 
    self._user_group = UserGroup(user=user, group=self) 

def save(self, *args, **kwargs): 
    super(Group, self).save(*args, **kwargs) 
    self._user_group.save() 
+0

Wie kann es selbst die m2m, wenn es keine Gruppe noch ist? Vielleicht habe ich es falsch gelesen. Habe nicht alles gelesen. –

+0

Ich habe die Antwort bearbeitet, um eine Lösung vorzuschlagen. –

+0

Das ist was ich meinte hehe. Aber es ist ein eleganter Weg! Ich tippte falsch, ich meinte, wie kann es die m2m retten, wenn es noch keine Gruppe gibt. –

Verwandte Themen