Frage Zugriff auf viele bis viele "bis" Relationen in Formsets


Meine Modelle:

class End_User(models.Model):
    location = models.ForeignKey(Location) 
    first_name = models.CharField(max_length=70, blank=True, null=True)
    email_address = models.CharField(max_length=70, blank=True, null=True)

class Phone_Client(models.Model):
    end_user = models.ManyToManyField(End_User)
...
    extensions = models.CharField(max_length=20)

class Line(models.Model):
    phone_client = models.ManyToManyField(Phone_Client, through='Phone_Line' )
    ....
    voicemail = models.BooleanField(default=False)  

class Phone_Line(models.Model):
    phone_client = models.ForeignKey(Phone_Client)
    line = models.ForeignKey(Line)
    line_index = models.IntegerField()

Im Grunde kann ein Endbenutzer viele Telefone haben, ein Telefon kann viele Leitungen haben, die durch Phone_line in Beziehung stehen.

Auf meiner Seite müssen alle diese Objekte editierbar sein und neue Instanzen haben die Laufzeit für Phone_Clients und Line all auf derselben Seite erstellt. Zur Zeit erstelle ich ein einfaches End_User Model Formular und Modelformset_factory Objekte für Phone_Client und Lines. Da ein Telefon viele Zeilen haben kann, kann jedes Telefonformular in der phone_formset ein Zeilenformsatzobjekt haben. Ich mache gerade so etwas

end_user = End_User.objects.get(pk=user_id)
user_form = End_UserForm(instance=end_user)

Phone_ClientFormSet = modelformset_factory(Phone_Client,form=PartialPhone_ClientForm,  extra=0, can_delete=True)

phone_clients_formset = Phone_ClientFormSet(queryset=end_user.phone_client_set.all(), prefix='phone_client')

all_lines = modelformset_factory(Line, form=PartialLineForm, extra=0, can_delete=True)

phone_clients = end_user.phone_client_set.all()

client_lines_formsets = {}
for phone in phone_clients:
    client_lines_formsets[phone.id] = all_lines(queryset=phone.line_set.all(), prefix='phone_client_'+str(phone.id))

Ich verwende diese Liste, um Zeilen, die zu einem phone_client gehören, in der Vorlage unter Verwendung von Formsets anzuzeigen.

Ich habe folgende Frage zu den Modellen

  1. Kann ich inline_formset factory verwenden, um viele bis viele Relationen zu behandeln, die eine through-Klasse enthalten? Wenn ja, wie mache ich das für die Verbindungen Phone_Client, Line und Phone_Line?

  2. Ich muss den line_index für ein bestimmtes Telefon, eine Linienkombination anzeigen, wie mache ich das in der Vorlage? Ich habe es angeschaut
    Wie greife ich auf die Eigenschaften einer Viele-zu-Viele-Tabelle durch eine Django-Vorlage zu? Ich möchte nicht nur anzeigen, sondern den Wert an das Telefon binden, Zeilenkombination wenn möglich in der Zeile oder Telefon-Formularsatz, so dass, wenn Benutzer den Index ändert, kann ich das in der Datenbank beim Buchen der Formularsatzdaten speichern.

Ich bin neu in Django, so dass jede Hilfe wirklich geschätzt wird. Vielen Dank!!


7
2018-06-13 18:38


Ursprung


Antworten:


Wie Sie wahrscheinlich wissen, können Sie viele-zu-viele-Beziehungen mit Inline-Formsätzen nicht bearbeiten. Sie können jedoch das Durchgangsmodell bearbeiten. Für Ihr Inline-Formset müssen Sie das Modell lediglich auf das Through-Modell festlegen, z.

inlineformset_factory(Phone_Client, Line.phone_client.through)

line_index wird tatsächlich ein sichtbares Feld auf dem Inline-Formular sein, so dass Sie wirklich nichts tun müssen. Wenn jemand den Index ändert, wird er gespeichert, wenn die Inline-Formulare wie die übrigen Felder gespeichert werden.


14
2018-06-13 20:11