Auf Fremdschlüsseltabelle der Fremdschlüsseltabelle zugreiffen

Django, Flask, Bottle, WSGI, CGI…
Antworten
rbaert
User
Beiträge: 20
Registriert: Mittwoch 5. September 2018, 15:37

Hallo zusammen

Wieder mal ich (ja ich stecke schon wieder fest) :cry: Diesmal aber mit einem etwas komplexeren Problem:
Erstmal meinem Models und einige Erklärungen dazu:

Code: Alles auswählen

class Attribut(models.Model):
    name = models.CharField(max_length=100)
    default_index = models.IntegerField(default=1)
    visible = models.BooleanField(default=True)
    send_value = models.CharField(max_length=10, default=None, null=True)
    work_rank = models.IntegerField(default=None, null=True)
    processing_method = models.CharField(max_length=4, default=None, null=True)

    def __str__(self):
        return self.name

class Attribut_Option(models.Model):
    attribut = models.ForeignKey(Attribut, on_delete=models.CASCADE)
    optionname = models.CharField(max_length=100)
    send_value = models.CharField(max_length=10, default=None, null=True)
    visible = models.BooleanField(default=True)

    def __str__(self):
        return self.optionname

class Display_Text(models.Model):
    text = models.CharField(max_length=200)
    create_date = models.DateField(default=timezone.now)
    placeholder_date = models.DateField(default=None, null=True)
    selected = models.BooleanField(default=False)

    def __str__(self):
        return self.text

class Display_Text_Attribut_Options(models.Model):
    text = models.ForeignKey(Display_Text, on_delete=models.CASCADE)
    attribut_option = models.ForeignKey(Attribut_Option, on_delete=models.CASCADE)
Ich arbeite wie bereits erwähnt an einem Web-Interface, mit dem ich ein LED-Panel ansteuern will. Damit ich dies auch zukünftig verwenden kann und um nicht gleich den "Weg des geringsten Wiederstandes" zu gehen, habe ich mir vorgenommen dieses Interface möglichst variabel zu gestalten.
Zum Model:
  • die Attribut sind die Namen der Drop-Down Felder der Einstellungen die gemacht werden können
    die Attribut_Optionen sind die jeweiligen Einträge dieser Auswahlfelder
    die Display_Texte sind die Meldungen selbst, die auf dem LED-Panel angezeigt werden sollen.
Der Anwender soll also einen Text eingeben und die Optionen dazu auswählen. Die Texte sollen dann inklusive der gewählten Anzeige-Optionen gespeichert werden. Dazu habe ich das letzte, in der obigen Liste nicht erwähnte Model erstellt.

Nun bin ich dabei, die zurückgelieferten Daten abzufüllen. Bei der Texteingabe funktioniert das super. Die dazugehörenden Optionen, sind leider etwas schwieriger. Ich habe bereits allerlei versucht, aber ich komme leider nicht weiter (obwohl ich denke, dass wahrscheinlich nicht viel fehlt).

Ich stelle hier auch mal meine View rein, wie sie aktuell ist. Es gibt aber sicher direktere Wege, mein Ziel zu erreichen. Ich denke aber, dass so meine Absicht etwas klarer wird. Bei der aktuellen Version kommt der Fehler: 'QuerySet' object has no attribute 'pk' Dieser Fehler leuchtet mir zwar ein, aber ich weis ehrlich gesagt nicht, wie ich ihn beheben könnte.

Code: Alles auswählen

def new_String(request):
    attribute_list = Attribut.objects.all().filter(visible=True)
    if request.method == 'POST':
        txt_display_text = request.POST.get('display_text')
        m = Display_Text(text=txt_display_text)

        for werte in attribute_list:
            if request.POST.get(werte.name, '') != None:
                effect = request.POST.get(werte.name)
                attr = Attribut.objects.get(name = werte.name)
                attrOpt = attr.attribut_option_set.all().filter(optionname = effect)
                inst = Attribut_Option.objects.get(pk = attrOpt.pk)
                n = m.display_text_attribut_options_set.create(attribut_option = inst)
        m.save()

    context = {'attribute': attribute_list, 'newString_page': 'active'}
    return render(request, 'sites/new_string.html', context)
Es kann auch sein, das ich völlig auf dem Holzweg bin, dann bin ich für einen anderen Ansatz dankbar.

Freundliche Grüsse
Roland
Antworten