Ich bin immer wieder beindruckt von eurer Geduld! Da ich ja etwa 99% der Fragen hier stelle und die wenigen anderen Fragen sich auf einem Level bewegen, den ich ebenfalls nicht verstehe, habe ich den Eindruck ich bin der einzige der so auf dem Schlauch steht. ... Aber ich gebe mir wirklich Mühe und habe mich auch durch die "Aggregation" versucht durchzuarbeiten und vermute, jetzt haben meine Problem etwas mit "Order of annotate() and values() clauses" zu tun.
Ich bekomme zwar schon was in meinem Template angezeigt, aber noch lange nicht so wie ich es brauche.
Folgende Probleme:
1. Zunächst mal muss ich für jede Schülerin und Schüler die Daten in einer Zeile anzeigen - schon das bekomme ich nicht hin.
2. Nicht alle Schülerinnen und Schüler haben alle Kategorien berechnet, wie bekomme ich die Summen unter die jeweiligen Überschriften? Diese Überschrift bekomme ich aus der Tabelle "Kategorien".
3. Die Summe der falschen Aufgaben will ich nicht anzeigen, das würde meine Anzeige sehr unübersichtlich machen. Ich ändere bisher die Hintergrundfarbe, je nach Fehlerquote, z.B. so:
Code: Alles auswählen
def quote_farbe(richtig, falsch):
try:
quote = falsch / (richtig + falsch)
if quote <= 0.1:
return "gruen"
elif quote <= 1/3:
return "gelb"
else:
return "rot"
except :
return "unset"
(ich versuche den Fehler abzufangen, der entsteht, wenn "falsch" 0 oder None ist)
4. Ich benötige auch nicht die Zeit der einzelnen Kategorien sondern die Gesamtzeit, die jede Schülerin / jeder Schüler insgesamt gearbeitet hat
5. Ebenso zusätzlich die Gesamtzahl der Aufgaben jeder Schülerin / jedes Schülers.
6. Und es gelingt mir nichtmal, in der ersten Spalte Vorname Nachname, Klasse angezeigt zu bekommen. Die müsste ja doch eigentlich "Profil" zurückliefern
Code: Alles auswählen
class Profil(models.Model):
user = models.OneToOneField(User, related_name='profil', on_delete=models.CASCADE )
nachname = models.CharField(max_length=30)
vorname = models.CharField(max_length=30)
klasse = models.CharField(max_length=10)
# diese Felder werden erst ausgefüllt, wenn ein Schüler seine Lerngruppe wählt
schule = models.ForeignKey(Schule, null= True, blank=True, on_delete = models.SET_NULL)
gruppe = models.ForeignKey(Lerngruppe, null= True, blank=True, on_delete = models.SET_NULL, related_name='gruppe')
jg = models.PositiveSmallIntegerField(validators=[MinValueValidator(1), MaxValueValidator(10)])
kurs= models.CharField(max_length=1, choices=wahl_kurs.choices, default=wahl_kurs.E_KURS,)
# werden beim Erstellen eingestellt
stufe = models.PositiveSmallIntegerField(default=5) #, editable=False)
sj = models.SmallIntegerField(default=0)
hj = models.SmallIntegerField(default=0)
katmax = models.IntegerField(default=0) # die Zeilennummer die höchsten gewählten Aufgabenkategorie
#voreinst = models.IntegerField(default=1) # hier können Voreinstellungen gesetzt und abgefragt werden
voreinst = models.JSONField(blank=True, null=True, default=dict)
def __str__(self):
return f"{self.vorname} {self.nachname}, {self.klasse}"
... aber:
bringt die Fehlermeldung
Ich mache das jetzt so (aber das ist sicher wieder viel zu umständlich):
Code: Alles auswählen
protokoll_statistics = (
Protokoll.objects
.values("user_id", "user__vorname", "user__nachname", "user__klasse", "kategorie__zeile")
.annotate(richtig_sum=Sum('richtig'))
.annotate(falsch_sum=Sum('falsch'))
.annotate(zeit_sum=Sum(F('end') - F('start')))
.order_by()
)
und im Template:
Code: Alles auswählen
<tbody>
{% for zeile in protokoll %}
<tr >
<td>{{zeile.user__vorname}} {{zeile.user__nachname}}, {{zeile.user__klasse}}</td>
<td></td>
<td></td>
<td>{{zeile.richtig_sum}}</td>
</tr>
{% empty %}
<tr><td colspan="999"><strong>Es sind noch keine Schüler angemeldet.</strong></td></tr>
{% endfor %}
</tbody>