alle "r" in queryset zählen

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

mit

Code: Alles auswählen

richtig = protokoll.filter(wertung__contains ='r').count()
kann ich zählen, wieviele Einträge in "protokoll.wertung" ein "r" enthalten. Mit meiner Wertetabelle können jetzt aber bis zu drei "r"s in einem Feld stehen. Wie zähle ich alle "r"s in "protokoll.wertung"?
Sirius3
User
Beiträge: 17825
Registriert: Sonntag 21. Oktober 2012, 17:20

Für mich hört es sich so an, als ob Du eine eigene Wertung-Tabelle brauchst, damit komplexe Dinge nicht in einem String gespeichert sein müssen.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

Eigentlich ist das gar nicht so komplex und das hat auch wunderbar funktioniert. Ich bin vielleicht etwas geizig mit den Fields in den models und nutze Einträge gerne multifunktional.
Meinst du, ich muss da meine Tabelle ändern oder geht das nicht so, wie ich das gerne hätte? Ich könnte ansonsten die "rr"s zählen und die "rrr"s, dann müsste ich davon wieder die "r"s abziehen, die mit den "rr"s und den "rrr"s auch schon gezählt wurden - das ist wirklich blöd. Mit Python und Dajango geht doch irgendwie alles (einfacher als gedacht). Ich habe ja auch schon alles mögliche ausprobiert und keine Lösung gefunden. Wenn es aber eine Möglichkeit alle "r"s zu zählen wäre ich happy!
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Du machst dir das Leben zu kompliziert.
Etwas so magisch in den Wert eines Feldes zu "verschlüsseln" ist in der Regel eine schlechte Idee, weil niemand die geheime Magie versteht.

Wenn 3 "r" irgendwas bedeuten - warum schreibst du dann icht 3 in das Feld?
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

Also für mich ist das praktisch und auch nicht so kryptisch. In "Wertung" protokolliere ich die Wertung der Eingaben meiner Nutzer. Das kann "richtig", "falsch", "Lösung anzeigen" oder "Abbrechen" sein. Für mich als Lehrer kann ich dann die Eingaben nachvollziehen: "r" ist klar, "fr" zeigt zunächst falsch, dann richtig, "fhr" zeigt das das Anklicken von Hilfe geholfen hat, "ra" zeigt, dass der User das Thema mit der Frage wahrscheinlich nicht beherrscht. Jetzt habe ich halt auch noch Tabellen mit drei Eingaben und könnte meine Schlüsse aus "rrr", oder "frrr" (es gibt noch mehr Möglichkeiten) ziehen. Für mich ist es klar so und eine zweite Spalte wäre nicht besser. Und auch die Eingabe einer Zahl wäre nicht so hilfreich. Auch das will ich erklären: Der User hat 3 Versuche und auch das wir protokolliert. Das könnte theoretisch so aussehen: "ffrfrrrrr" da wurde nacheinander erst eine, dann zwei und zuletzt alle drei Zahlen eingegeben, es wäre nicht sinnvoll dazu 6 richtige Eingaben zu werten, ich ersetze also bei Eingabe aller drei Lösungen diese Wertung durch "frrr" oder ähnlich. Auch das geht mit meinem Prinzip einfacher als andere Möglichkeiten.
Wie schätzt du das ein: Gibt es keine Möglichkeit die "r"s zu zählen oder erscheinen dir nur andere Möglichkeiten als bessere Lösung?
Übrigens protokolliere ich auch die Eingaben (das geht, wie beschrieben, bis zu dreimal. Das können Zahlen oder auch Zeichenketten sein, daher ist das mit der Lokalisierung, die wir in einem anderen Posting diskutieren auch nicht so einfach. Und auch bei den Lösungen gibt es oft mehrere Möglichkeiten, auch hier gibt es Zahlen und Zeichenketten und dann gibt es auch noch Lösungen bei denen nicht die volle Punktzahl oder auch Extrapunkte vergeben werden. Das speichere ich in Listen und auch dies haben wir schon an anderer Stelle behandelt. Funktioniert aber meines Erachtens gut.
Nur die "r" s bereiten mir jetzt Probleme.
Benutzeravatar
__blackjack__
User
Beiträge: 13241
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Ist so ein übliches Muster was man hier öfter sieht: OP macht etwas falsch. Bekommt gesagt das ist falsch. Verteidigt das mit „für mich funktioniert das aber prima“. Was aber nicht stimmt, denn es gibt ja eine Frage dazu das damit etwas halt doch nicht funktioniert. Was daran liegt das es halt falsch gemacht wird. Was soll man da dann noch sagen?

Sowohl das mit den Buchstabenfolgen als auch *Listen* in einem Datenbankfeld zu speichern ist falsch. Und dann scheinen das auch noch parallele Daten zu sein, also jeweils ein Buchstabe aus *diesem* Felde, scheint mit einem Element aus der Liste aus dem anderen Feld zu korrespondieren. Das wäre ja schon falsch wenn das nicht mal in der Datenbank sondern nur im Arbeitsspeicher passieren würde. Zusammengehörige Daten sollten nicht getrennt in ”parallelen” Datenstrukturen stehen. Das macht am Ende nur die Code unnötig komplizierter der das dann verarbeiten muss.

Es sieht so aus als wäre eine Tabelle für Antworten hier sinnvoll, mit ID, Fremdschlüssel zur Frage, eingegebene Antwort, und die Bewertung.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

Sorry, damit bin ich überfordert. Meine Antworten und deren Bewertung stehen doch in einer Tabelle und die Frage auch. Es handelt sichbei diesem speziellen Beispiel um eine Wertetabelle, die sieht z.B. so aus:
Bild
Das sind im Prinzip drei Fragen, die in beleibiger Reihenfolge auf einmal oder nacheinander mit insgesamt drei Versuchen beantwortet werden können. Ich hätte keine Idee, wie ich das besser speichern könnte und vor allem, wie ich auf einen Blick feststellen könnte, wie die Schülerinnen / der Schüler damit umgegangen ist, ob sie / er Hilfen annimmt, daraus was lernt oder mit der entsprechenden Frage überfordert ist.
Benutzeravatar
snafu
User
Beiträge: 6750
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Pitwheazle
Es gibt einerseits die Datenhaltung, also wie das Speichern der Daten und die Zugriffe sinnvoll organisiert sind. Und es gibt die Repräsentation: Eben wie es für dich als Anwender sinnvoll aufbereitet wird. Du vermischt leider die beiden Dinge. Was für dich nachvollziehbar praktisch erscheint, muss auf der technischen Ebene (quasi dem Backend) nicht zwangsläufig genau so praktikabel sein. Und diese Denke fliegt dir jetzt um die Ohren. Du bist an einem Punkt angekommen, wo du die Datenhaltung ändern solltest, sonst wird der Rest des Projekts nur noch Murks (d.h. schwer verständlicher Code, der irgendwann kaum noch wartbar oder erweiterbar ist).

__blackjack__ hat sich bestimmt auf die einzelnen Eingaben bezogen als er von Antworten schrieb. Für dich sind Antworten offenbar die Komplettlösung der jeweiligen Aufgabe. Du willst es schön kompakt haben, aber wie gesagt: Das ist die Ebene der Darstellung. Du solltest diese kompakte Darstellung sinnvollerweise also nicht mehr direkt so in die Datenbank schreiben, sondern sie auf Abruf erzeugen. Das ist keine Seltenheit, dass Daten für den User aus mehreren Tabellen zusammengesetzt werden. Genau genommen ist das eine wesentliche Vorgehensweise bei relationalen Datenbanken.
Benutzeravatar
Kebap
User
Beiträge: 696
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Das eine ist, wie die Daten gespeichert werden, das andere ist, wie sie dann später übersichtlich dargestellt werden.
In deiner Excel-Version des Rechentrainers waren beide Fälle aber vermutlich identisch, eben der Inhalt einer Zelle.

Als Webanwendung kannst du da schon viel freier agieren: Datenbank und Browser sind unterschiedliche Systeme.
Dann brauchst du natürlich Code, der dir automatisiert die Daten aus den Tabellen sammelt und für den Browser übersetzt.
Der übersichtlichen Anzeige im Browser ist aber egal, wie die Datenbank strukturiert ist, und da gibt es grundsätzliche Empfehlungen.
Ich bin vielleicht etwas geizig mit den Fields in den models und nutze Einträge gerne multifunktional.
Das ist ein Rezept für Desaster und war vielleicht mal sinnvoll, als Speicherplatz und Übertragungsgeschwindigkeiten begrenzter waren.
Heutzutage empfiehlt man eher, die Daten so aufzutrennen, dass jedes Feld nur genau eine Information enthält und keine Kopplung.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

snafu hat geschrieben: Mittwoch 15. Februar 2023, 14:38
... (d.h. schwer verständlicher Code, der irgendwann kaum noch wartbar oder erweiterbar ist)....
das befürchte ich auch, aber ich habe mir Mühe gegeben ihn immer schön zu kommentieren. Ich fürchte nur, da komme ich nicht mehr raus.
__blackjack__ hat sich bestimmt auf die einzelnen Eingaben bezogen als er von Antworten schrieb. Für dich sind Antworten offenbar die Komplettlösung der jeweiligen Aufgabe.
Ich habe das schon verstanden und habe daher auch versucht, mein Vorgehen zu erklären. Meine Aufgaben sind meistens "eindimensional", also kleines Einmalein oder Kopfrechenaufgaben oder Figuren und Körper benennen (wobei hier auch schon gilt, dass eine Raute auch Rhombus" heißen kann und ich auch noch einen Hinweis gebe, falls die Groß- und Kleinschreibung nicht beachtet wurde). Da erzeuge ich die richtige Antwort zusmammen mit der Aufagbenstellung. Bei einem Koordinatensystem mit verschiedenen Einteilungen habe ich ziemlich viele Parameter, die die richtige Antwort beeinflussen. Wenn also die Koordinaten eines Punktes im Koordinatensystem oder der Wert einer Zahl auf dem Zahlenstarhl abgelesen werden muss, sieht dieser Zahlenstrahl und unter Umständen auch das Koordinatensystem vollkommen anders aus. Hier die richtige Antwort erst aus diesen Parametern wieder abzurufen überfordert mich, daher speichere ich die Antwort(en) in der gleichen Tabelle. Bei einigen Kategorien (Zuordnungen, Therme, alle Arten von Funktionen) gibt es nunmal die beschriebenen Wertetabellen und ich sehe eine Wertetabelle als eine Aufgabe mit mehreren Antworten an und wüsste jetzt nicht, wie ich die auseinanderklamüsern kann.
Ich werde aber gerne eure Ratschläge berücksichtigen und versuchen, sie in Zukunft (oder auch rückwirkend) mehr anzuwenden. Was speziell an meinem "fhrrr" String gefällt euch nicht?
Benutzeravatar
snafu
User
Beiträge: 6750
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es geht ja an sich nicht um die Gliederung der Antworten, sondern welche Punkte du bewertest. Und darauf willst da ja prüfen (Anzahl korrekter Teillösungen). Wenn du jetzt Lösung/Anwort mit Nullen und Einsen oder booleschen Werten in zusätzlichen Spalten definierst (istKorrekt, mitWiederholung, mitHilfe, ...) musst du nicht so sehr gegen dein DBMS arbeiten, sondern könntest die Anzahl der wahren Einträge einfach zählen lassen, anstatt die Repräsentation der Bewertung zum Teil wieder zerlegen zu müssen.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

ja, da muss ich das wohl so machen. Allerdings ist meine Projekt ja auch schon online. Da muss ich jetzt die Datenbank aktualisieren (das habe ich online noch nicht gemacht - bekomme ich aber hoffentlich raus), da müsste ich aber trotzdem die "r"s in "wertung" auswerten. Das geht zurzeit noch, da in der Onlineversion bisher jeweils nur ein "r" in "wertung" steht.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

So, ich habe jetzt brav meine Tabellen ergänzt.
Jetzt muss ich ja aber die bestehenden Tabellen updaten und brauche (natürlich) auch da Hilfe. Wie mache ich das? In der Shell geht das nicht - oder?
Ich brauche einen Code - etwa so:

Code: Alles auswählen

from core.models import Protokoll
for p in Protokoll:
	if "r" in "protokoll.wertung:
		protokoll.richtig = 1
	if "f" in "protokoll.wertung:
		protokoll.falsch = 1
	if "a" in "protokoll.wertung:
		protokoll.abbr = True	
	if "Lsg" in "protokoll.eingabe:
		protokoll.lsg = True
	if "h" in "protokoll.wertung:
		protokoll.hilfe = True	
... speichere ich den Code in einer Datei, die ich in der Shell aufrufe? (ich bin wirklich sehr blond ... naja, eher grau).

Und by the way: Nachdem ich meinen Zähler, auf euren Rat, umgestellt habe auf:

Code: Alles auswählen

richtig = summe.aggregate(Sum('richtig'))['richtig__sum']
Ergibt sich auch "richtig = None" - da können die Kids nix mit anfangen - aber für:

Code: Alles auswählen

richtig = summe.aggregate(Sum('richtig'))['richtig__sum']
if richtig == "None":
    richtig = 0
Gibt es sicher eine elegantere Lösung?
Und wie zählt man die "True"s in "protokoll.abbr", protokoll.hilfe" und "protokoll.lsg"?
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

So, den ersten Teil habe ich hinbekommen:

Code: Alles auswählen

def update(req):
    protokoll = Protokoll.objects.all()
    for zeile in protokoll.iterator():
        print(zeile.wertung) 
        if "a" in zeile.wertung:
            zeile.abbr = True
        else:
            zeile.abbr = False   
        if "r" in zeile.wertung:
            zeile.richtig = 1
        if "f" in zeile.wertung:
            zeile.falsch = 1

        if "Lsg" in zeile.eingabe:
            zeile.lsg = True
        if "Hilfe" in zeile.wertung:
            zeile.hilfe = True
        zeile.save()	
    return HttpResponse("fertig!")
... und der zweite so

Code: Alles auswählen

        temp = protokoll.aggregate(Sum('richtig'))['richtig__sum']
        richtig = temp if temp else  0
?
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Der erste Teil ist das Anpassen der bestenden Datenbank?
Dann solltest du dir anschauen, wie du das in Migrationen machst. Stichwort data migrations.
Pitwheazle
User
Beiträge: 909
Registriert: Sonntag 19. September 2021, 09:40

Django erinnert mich immer mehr an beschrieben Angelkiste. Da sind immer wieder erstaunliche Sachen drin! (Allerdings verstehe ich hier mal wieder nur einen Teil)
Antworten