2017-08-22 5 views
0

Ich habe ein Modell mit einem benutzerdefinierten Speicherfunktion Geben, wo ich auf einem Zustand wie diese bestimmte Funktionen auf Basis ausführen mag:kwargs in get_or_create Methode in Django

class ClassName(models.Model): 

    def save(self, *args, **kwargs): 
     reindex = **kwargs.pop("reindex") 

     super().save(*args, **kwargs) 

     if reindex: 
      People.objects.create() 

nun in einer Aufgabe, die ich mag, dass die anrufen folgende:

kwargs = { "reindex": False} 
ClassName.objects.get_or_create(**kwargs) 

Wenn es schaffen wird, läuft es offensichtlich die Funktion speichern, aber es gibt mir eine Fehlermeldung, reindex is not a field. Ich habe es seit einer Weile erforscht und kann nicht herausfinden, was zu tun ist. Vielleicht kann mir jemand in die richtige Richtung zeigen.

Ich möchte nur ein Argument in die get_or_create übergeben, so dass ich eine bestimmte Funktion in der Speichermethode bedingt ausführen kann.

Vielen Dank im Voraus!

Antwort

1

Wenn Sie

tun
kwargs = { "reindex": False} 
ClassName.objects.get_or_create(**kwargs) 

es

tatsächlich gleichwertig ist
ClassName.objects.get_or_create(reindex=False) 

Da somit reindex nicht erscheint ein Feld, in dem Modell ClassName definiert ist, erhalten Sie einen Fehler.


Übrigens, abgesehen von Dingen, die fehlerhaft erscheinen, z.B. reindex = **kwargs.pop("reindex") sollten Sie reindex als eines der Felder Ihres Modells definieren. Aber ich gebe zu, dass ich blind antworte, denn für mich kann Ihre Klassendefinition nicht so funktionieren. Wenn man annimmt, dass Reindex ein Integer-Feld ist, könnten Sie tun

class ClassName(models.Model): 
    reindex = models.IntegerField(null=True) 

    def save(self, *args, **kwargs): 
     super(ClassName, self).save(*args, **kwargs) 
     if "reindex" in kwargs: 
      People.objects.create() 
+0

Ich sehe! Würdest du wissen, was ich tun kann, um zu meiner Lösung zu kommen? – Nazariy1995

+0

@ Nazariy1995. Probieren Sie es aus. 'makemigrations' und' migrieren' dann. Funktioniert es ? Es ist unwahrscheinlich, da ich nicht das mache, was Sie tatsächlich versuchen. – Kanak

+0

Ich habe ehrlich gesagt eine ganz andere Art und Weise verwendet, um es ohne den Benutzer von Kwarts zu tun. Vielen Dank für die Hilfe – Nazariy1995