Datenmodell für Bewertungssystem (5 stars) ergänzt.
This commit is contained in:
@@ -133,3 +133,63 @@ class Bestellung(models.Model):
|
||||
verbose_name = "Bestellung"
|
||||
verbose_name_plural = "Bestellungen"
|
||||
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
class Bewertung(models.Model):
|
||||
"""
|
||||
Repräsentiert die Bewertung eines Gerichts durch einen Nutzer.
|
||||
"""
|
||||
|
||||
class Sterne(models.IntegerChoices):
|
||||
EINER = 1, '★☆☆☆☆'
|
||||
ZWEI = 2, '★★☆☆☆'
|
||||
DREI = 3, '★★★☆☆'
|
||||
VIER = 4, '★★★★☆'
|
||||
FUENF = 5, '★★★★★'
|
||||
|
||||
user = models.ForeignKey('Person', on_delete=models.CASCADE, related_name='bewertungen')
|
||||
gericht = models.ForeignKey('Gericht', on_delete=models.CASCADE, related_name='bewertungen')
|
||||
sterne = models.IntegerField(choices=Sterne.choices, default=3)
|
||||
kommentar = models.TextField(blank=True, null=True)
|
||||
datum = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
# Das Feld für die Verifizierung
|
||||
ist_verifiziert = models.BooleanField(
|
||||
default=False,
|
||||
help_text="Wird automatisch auf True gesetzt, wenn eine bezahlte Bestellung vorliegt."
|
||||
)
|
||||
|
||||
class Meta:
|
||||
# Verhindert, dass ein Nutzer dasselbe Gericht mehrfach bewertet
|
||||
unique_together = ('user', 'gericht')
|
||||
verbose_name = "Bewertung"
|
||||
verbose_name_plural = "Bewertungen"
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.user.user.username} bewertet {self.gericht.name} mit {self.sterne} Sternen"
|
||||
|
||||
def clean(self):
|
||||
"""
|
||||
Hier können wir zusätzliche Validierungen einbauen.
|
||||
"""
|
||||
if self.sterne < 1 or self.sterne > 5:
|
||||
raise ValidationError("Die Bewertung muss zwischen 1 und 5 Sternen liegen.")
|
||||
|
||||
def check_verifizierung(self):
|
||||
"""
|
||||
Ein hilfreicher Service-Method, um den Status der Verifizierung
|
||||
automatisch zu prüfen.
|
||||
"""
|
||||
# Wir prüfen, ob es eine Bestellung für diesen User und dieses Gericht gibt,
|
||||
# die bereits als 'bezahlt' markiert ist.
|
||||
exists = Bestellung.objects.filter(
|
||||
person=self.user,
|
||||
menue__gericht=self.gericht,
|
||||
bezahlt=True
|
||||
).exists()
|
||||
|
||||
if exists:
|
||||
self.ist_verifiziert = True
|
||||
return self.ist_verifiziert
|
||||
|
||||
Reference in New Issue
Block a user