2017-04-19 1 views
1

erstellen Mit ein wenig Mühe versuchen, eine Liste von Elementen zu einem vielen zu vielen Feld hinzufügen und obwohl mehrere Dinge ausprobiert haben keine Ahnung, wie Sie sich nähern Dies. Ich habe mir die Django-Dokumentation angeschaut und finde nicht, wonach ich suche. HierDjango Liste aus dem Text eines Felds zu vielen zu vielen Feld

ist der Code für meine Modelle:

class Subject(models.Model): 
    noun = models.CharField(max_length=30, null=True, blank=True) 

class Knowledge(models.Model): 
    item_text = models.TextField() 
    item_subjects = models.ManyToManyField(Subject, null=True, blank=True) 

def add_subjects(sender, instance, *args, **kwargs): 

    if instance.item_info: 
     item_subjects = classifier.predict_subjects(instance.item_info) 

     if item_subjects: 
      .... 

post_save.connect(add_subjects, sender=Knowledge) 

Die Liste der classifer.predict_subjects Funktion erzeugt wird. Ich habe versucht, die m2m_changed Stecker und die pre_save und post_save verbinden. Ich bin mir nicht einmal sicher, dass das Feld "Viele zu viele" die richtige Option ist, wenn es besser wäre, eine Fremdschlüsselbeziehung aufzubauen. anstelle der '...' Ich habe dies versucht, aber es schafft nicht die Beziehung zwischen und speichert nur die letzte.

for sub in item_subjects: 
    subject = Subject(id=instance.id, noun=sub) 
    subject.save() 

ich auch

habe versucht
instance.item_subjects = item_subjects 

und eine Last mehr Dinge, die ich nicht wirklich daran erinnern kann, glaube ich nicht wirklich, dass ich in der richtigen Baseballstadion bin ehrlich zu sein. Irgendwelche Vorschläge?

edit:

ok, so habe ich habe es all die Liste Elemente hinzufügen, aber haben es nicht geschafft, diese Elemente in die viele zu viele Feld zu verknüpfen.

 for sub in item_subjects: 
      subject = Subject.objects.get_or_create(noun=sub) 

bearbeitet 2:

So ziemlich genau außerhalb der Schleife die gleiche Sache in der Schale Django tun scheint zu funktionieren und speichert die Eingabe aber es funktioniert nicht in der Funktion. 3

>>> k[0].item_subjects.all() 
<QuerySet []> 
>>> d, b = Subject.objects.get_or_create(noun="cats") 
<Subject: cats> 
>>> k[0].item_subjects.add(d) 
>>> k[0].item_subjects.all() 
<QuerySet [<Subject: cats>]> 

bearbeiten

Also nahm ich, was Robert vorgeschlagen und es funktioniert in der Schale wie oben nur nicht, wenn es in dem Admin-Interface. Die print-Anweisungen in meinem Code zeigen, dass das Array-Element aktualisiert wird, aber es wird nicht beibehalten. Ich lese herum und das scheint ein Problem zu sein, das mit dem Admin-Formular zu tun hat, das Gegenstände vor dem Speichern löscht.

def sub_related_changed(sender, instance, *args, **kwargs): 

    print instance.item_subjects.all() 

    if instance.item_info: 
     item_subjects = classifier.predict_subjects(instance.item_info) 

     if item_subjects: 
      for sub in item_subjects: 
       subject, created = Subject.objects.get_or_create(noun=sub) 
       instance.item_subjects.add(subject) 

     print instance.item_subjects.all() 


post_save.connect(sub_related_changed, sender=Knowledge) 

habe ich versucht, die Funktion als Signal verwendet m2m_changed wie folgt:

m2m_changed.connect(model_saved, sender=Knowledge.item_subjects.through) 

Aber dies entweder erzeugt eine rekursive Schleife oder nicht ausgelöst wird.

Antwort

0

Sobald Sie die subject Objekte haben (wie Sie in Ihrem bearbeiten haben), können Sie sie mit

for sub in item_subjects: 
    subject, created = Subject.objects.get_or_create(noun=sub) 
    instance.item_subjects.add(subject) 

Das „item_subjects“ Attribut hinzufügen ist eine Möglichkeit, die entsprechenden Elemente der Verwaltung. Die Durchgangsbeziehungen werden über die Methode "add" erstellt.

Sobald Sie dies getan haben, können Sie Dinge wie instance.item_subjects.filter(noun='foo') oder instance.item_subjects.all().delete() und so weiter

Dokumentation Referenz: https://docs.djangoproject.com/en/1.11/topics/db/examples/many_to_many/

EDIT Ahh ich war nicht klar, dass dies stattfand in der Django Admin. Ich denke du hast Recht, dass das das Problem ist. Beim Speichern ruft der Administrator zwei Methoden auf: Die erste ist model_save(), die die save() -Methode des Modells aufruft (wobei ich annahme, dass dieser Code lebt). Die zweite Methode, die es aufruft, ist "save_related", die zuerst ManyToMany-Beziehungen löscht und dann basierend auf den übermittelten Formulardaten speichert. In Ihrem Fall gibt es keine gültigen Formulardaten, da Sie die Objekte beim Speichern erstellen.

Wenn Sie die relevanten Teile dieses Codes in die save_related() -Methode des Administrators einfügen, sollten die Änderungen beibehalten werden.

Ich kann genauer sagen, wohin es gehen soll, wenn Sie sowohl Ihre < App> /models.py als auch Ihre < App> /admin.py Dateien posten.

Referenz von einer anderen SO Frage: Issue with ManyToMany Relationships not updating inmediatly after save

+0

Dank für Ihre Hilfe, die immer noch nicht aus irgendeinem Grunde zu arbeiten. in der Django-Shell funktioniert das fast genauso. zB '>>> k [0] .item_subjects.all() >>> d, b = Subject.objects.get_or_create (Substantiv = "cats") >>> d > >> k [0] .item_subjekts.add (d) >>> k [0] .item_subjects.all() ]> 'muss ich noch etwas anderes machen? –

+0

Froh, dass es in der Shell funktioniert. Mind-Editing, um den neuen Code, den Sie außerhalb der Shell verwenden (den Code, der immer noch nicht funktioniert?) Jetzt anzuzeigen, nachdem Sie die Methode .add() hinzugefügt haben? –

+0

kk danke, ich habe es wieder aktualisiert. –

Verwandte Themen