2017-09-04 2 views
0

Ist es möglich, jeder ManyToMany-Feldoption ein oder mehrere Zeichenfelder hinzuzufügen?Django: Hinzufügen weiterer Felder zu jeder ManyToMany-Feldoption

enter image description here

Meine Models:

class engineeringUni(models.Model): 
    field2 = models.CharField(max_length=200) 
    des_eng = models.CharField(max_length=1000, default='Add description') 


    def __str__(self): 
     return self.field2 

    def description_eng_universities(self): 
     return self.des_eng 

class engineering_courses(models.Model): 
    course_name = models.CharField(max_length=400) 
    course_description = models.CharField(max_length=1000, default='This is a description') 
    course_offered_by = models.ManyToManyField(engineeringUni, related_name='course_offered_by') 
    course_duration = models.IntegerField(blank=False, default='2') 

    def __str__(self): 
     return self.course_name 

    def description_course(self): 
     return self.course_description 

    def offered_by_courses(self): 
     return self.course_offered_by 

    def duration_courses(self): 
     return str(self.course_duration) 

Wie Sie im Bild sehen können, habe ich die Optionen im ManyToMany Feld. Diese Optionen sind:

  • University 1
  • Universität 2
  • Universität 3

Was ich haben will, ist ein zusätzlicher Text (Char) Feld neben jeder dieser Optionen (University 1 , Universität 2, Universität 3).

Ist das möglich?

EDIT 1:

Aktuelle Code:

class engineering_courses(models.Model): 
    course_name = models.CharField(max_length=400) 
    course_description = models.CharField(max_length=1000, default='This is a description') 
    course_offered_by = models.ManyToManyField(
     engineeringUni, 
     through='ThroughModel', 
     through_fields=('course', 'university'), 
     ) 
    course_duration = models.IntegerField(blank=False, default='2') 



    def __str__(self): 
     return self.course_name 

    def description_course(self): 
     return self.course_description 

    def offered_by_courses(self): 
     return self.course_offered_by 

    def duration_courses(self): 
     return str(self.course_duration) 



class ThroughModel(models.Model): 
    course = models.ForeignKey(engineering_courses, on_delete=models.CASCADE) 
    university = models.ForeignKey(engineeringUni, on_delete=models.CASCADE) 
    additional_text = models.CharField(max_length=200) 

EDIT 2: Problem behoben. Ich bekam keinen Tabellenfehler, weil ich die Migrationsdateien gelöscht und die Datenbank (db.sqlite3) -Datei gelöscht und die Migration erneut durchgeführt hatte.

+0

, die helfen könnten: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships. Das löst die Backend-Seite dieses Problems. Ich bin nicht sicher, ob es eine fertige Lösung in Form eines Formular-Widgets für diese Art von Situation gibt. –

Antwort

0

Sie können ein Modell through im ManyToManyField (docs) verwenden. Dieses Modell kann zum Speichern zusätzlicher Felder verwendet werden.

+0

Vielen Dank dafür. Ich kannte Through-Modelle nicht. Also, ich habe versucht, Ihren Code, aber jetzt das ManyToMany Field ist nicht mehr verfügbar in diesem engineering_courses. (Im Adminbereich). Wenn ich hinzufügen, dass "ThroughModel" in admin.py 'admin.site.register (ThroughModel)' dann ThroughModel in Admin-Seite auf Öffnen Sie sagt 'OperationalError an/admin/theproject/throughmodel/ nein solche Tabelle: theproject_throughmodel' –

+0

Ich denke, Sie fehlen die richtigen Makemigrationen. Versuchen Sie Makemigrationen auszuführen und migrieren Sie dann – arjun27

+0

Ich tat das auch, aber es hat nicht funktioniert. Sogar versucht durch Zurücksetzen von Migrationen (durch Entfernen von Migrationsdateien), aber immer noch die gleichen. –

0

Werfen Sie einen Blick auf die Django-Dokumente, auf die in der Antwort von arjun27 verwiesen wird. Sie haben mehr als einen Fremdschlüssel in Ihrem ThroughModel, also ist django verwirrt. Versuchen Sie, die Durchgangsfelder in Ihrem Engineering-Kursmodell anzugeben, migrieren Sie die Änderungen und prüfen Sie, ob das funktioniert.

Mark

+0

habe ich diese 'Through Fields' wieder verpasst. Danke, dass du mich erinnerst. Obwohl ich versucht habe, gibt es immer noch diesen Fehler.Eine Sache, die ich spezifizieren sollte, ist, dass wenn ich direkt auf "Hinzufügen" neben "Through Models" klicke, anstatt auf die Seite "Through Models" zu gehen. Es bringt mich auf die Seite um Dinge hinzuzufügen (aber beim Speichern wird der selbe Fehler angezeigt). Ich habe meine Frage bearbeitet und meinen gegenwärtigen Code auch eingeschlossen, schaut es auch an :) ~ Danke. –

+0

Vielen Dank für das Anzeigen dieser "durch Felder" :) Leider habe ich nicht genug Wiederholungen zu upvote. –

Verwandte Themen