2016-11-11 5 views
1

Ich habe Probleme beim Überschreiben der Speichermethode in einem Django-Modell, um eine Einschränkung für ein Viele-zu-Viele-Feld zu überprüfen.Problem beim Überschreiben der Speichermethode beim Django-Modell mit ManyToManyField

Say I haben die folgenden Modelle:

class Person(models.Model): 
    name = models.CharField() 

class ClothingItem(models.Model): 
    description = models.CharField() 
    owner = models.ForeignKey(Person) 

class Outfit(models.Model): 
    name = models.CharField() 
    owner = models.ForeignKey(Person) 
    clothing_items = models.ManyToManyField(ClothingItem) 

I eine Beschränkung der Methode der saveOutfit setzen möchte, dass jede ClothingItem in einer bestimmten Ausstattung stellt sicher, dass die gleiche Inhaber wie die Outfit selbst hat.

I.e. Ich möchte schreiben:

class Outfit(models.Model): 
    name = models.CharField() 
    owner = models.ForeignKey(Person) 
    clothing_items = models.ManyToManyField(ClothingItem) 

    def save(self, *args, **kwargs): 
     for ci in self.clothing_items: 
      if ci.owner != self.owner: 
       raise ValueError('You can only put your own items in an outfit!) 
     super(Outfit, self).save(*args, **kwargs) 

aber wenn ich versuche, dass ich einen Fehler über <Outfit: SundayBest>" needs to have a value for field "outfit" before this many-to-many relationship can be used.

Irgendwelche Ideen, was falsch ist hier los?

Antwort

2

Hier gibt es zwei Probleme. Um Ihre Frage direkt zu beantworten, bedeutet der Fehler im Wesentlichen: Sie können sich nicht auf eine m2m-Beziehung beziehen, wenn das ursprüngliche Objekt (eine Instanz von Outfit hier) nicht in der Datenbank gespeichert ist.

Klingt wie Sie versuchen, die Validierung in save() Methode, die eine ziemlich schlechte Praxis in Django ist. Der Verifizierungsprozess sollte in der Regel in Form stattfinden, das Outfit Objekte erstellt. Um das Standard-Django-Formular zu überschreiben, beziehen Sie sich bitte auf django ModelAdmin.form. Um zu verstehen, wie die Validierung von Django-Formularen durchgeführt wird, überprüfen Sie ModelForm validation.

Wenn Code für die Validierung von m2m verwendet werden soll, habe ich good example from SO gefunden.

Verwandte Themen