Listen in JSON Field speichern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

Ich schon wieder!
Bei meinem Rechenduell will ich die Eingaben speichern. Immer wenn eine neue Aufgabe erstellt wird, wird ein Eintrag im "Duell_Protokoll" erzeugt. In diesem wird die Lerngruppe und die beiden Duellanten gespeichertr und jetzt will ich auch noch die Eingaben und Wertungen speichern. Zunächst wollte ich das einfach in einem Charfield erledigen, zwischenzeitlich fände ich es sinnvoller, bei jeder Eingabe eine Liste (oder Tuple) zu speichern. Dazu ist mir nichts besseres eingefallen als ein JSON Field:

Code: Alles auswählen

class Duell_Protokoll(models.Model):
    protokoll = models.ForeignKey(Protokoll, related_name='duellprotokoll', on_delete=models.CASCADE)
    gruppe = models.ForeignKey(Lerngruppe, related_name='duellgruppe', on_delete=models.CASCADE)
    duellant_1 = models.ForeignKey(Duellant, related_name='duellant_1', on_delete=models.CASCADE)
    duellant_2 = models.ForeignKey(Duellant, related_name='duellant_2', on_delete=models.CASCADE)
    wertung = models.JSONField()
Bei der Erstellung der Aufgabe wird ein entsprechender Eintrag im Duell_Protokoll erzeugt:

Code: Alles auswählen

        duell_protokoll = Duell_Protokoll.objects.get_or_create(
            protokoll = protokoll, gruppe = gruppe, duellant_1 = duellant_1, duellant_2 = duellant_2, wertung =[]  
        ) 
und bei jeder Eingabe will ich dann eine Liste mit Name, Eingabe und Bewertung speichern.

Code: Alles auswählen

duell_protokoll.wertung += [duellant.name, str(eingabe), str(duellant.punkte_spiel)]
Das funktioniert noch nicht so ganz wie ich will:
1. Wird hier, wenn eine zweite Eingabe erfolgt (weil die erste falsch war) eine neue Liste angehängt sondern die bestehende Liste verlängert.
2. Muss ich bei der Aufgabenerstellung schon eine leere Liste in "Wertung" eintragen, sonst erfolgt ein Fehler wenn ich die (eigentlich) erste Liste einfügen will.
3. Will JSON auch keine Decimal akkzeptieren, ich muss die Werte zunächst in Strings umwandeln.
Vielleicht ist meine Rangehensweise ja aber überhaupt nicht sinnvoll?
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

Das ist nicht sinvoll.
Du verwendest eine relationale Datenbank. Also benutze die auch.
Es gibt ein Model "Wertung" oder mit einem passenderen Namen und darin sind dann die Felder, die du befüllen willst.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich verstehe das Problem nicht wirklich... Listen haben in Python eine `append` und `extend` Methode. Die solltest du nutzen, um bestehende Listen zu erweitern.

Außerdem fehlt irgendwie der Kontext, wie das Duell aktuell wirklich abläuft? Sind das mehrere Request-Resposen Zyklen oder läuft das alles in einem? Also musst du im laufenden Duell Daten nachladen oder liefert ein Request alle Daten für ein Duell? Wo und wann rufst du die `save` Methode der Instanz des Duellprotokolls auf?
Will JSON auch keine Decimal akkzeptieren, ich muss die Werte zunächst in Strings umwandeln.
Decimal ist ein Datentype von Python, denn kennt JSON halt nicht. Was JSON kennt: https://www.json.org/json-en.html

Aber warum speicherst du nicht die Antworten in einer eigenen Tabelle und ordnest die Antworten über eine 1:N Beziehung einem Duellprotokoll zu?

Gruß, noisefloor
Antworten