Warum zwei Einträge in der Tabelle "authlog"
Verfasst: Freitag 27. Februar 2026, 13:28
Hallo Liebes Forum,
ich komme einfach nicht weiter. Ich hoffe jetzt auf eure Hilfe, hier erst schonmal danke.
Meine Ausgangsstellung: Ich habe drei Tabellen "mitarbeiter", "kunden_allgemein", "kunden_anamesse"
Die beiden Tabellen "kunden_allgemein" und "kunden_anamesse" haben eine 1:1 Beziehnung.
Des weiteren habe ich noch eine Tabelle "authlog" in dieser speichere ich die Änderungen an den Tabellen.
Hier das OptimisticLockingModel:
Die beiden Tabellen "kunden_allgemein" und "kunden_anamesse" zeige ich an und bearbeite sie über eine forms.html und
die Änderungen beider Tabellen werden über einen Speicher Button gespeichert.
Jetzt zu dem Problem, wenn ich an der Tabelle "mitarbeiter" eine Änderung vornehme und diese speichere,
so bekomme ich einen Eintrag in der Tabelle "authlog" über die Änderung.
Das gleiche auch mit der Tabelle "kunden_anamesse".
Nur bei einer Änderung in der Tabelle "kunden_allgemein",
da werden in die Tabelle "authlog" zwei Einträge für die gleiche Änderung gespeichert.
Warum zwei? Einer genügt mir.
Hier noch weitere Code Snipsel:
Ich hoffe ihr könnt mir weiterhelfen, ich habe schon gefühlt alles umgestellt, abgefragt und ausprobiert.
Danke
ich komme einfach nicht weiter. Ich hoffe jetzt auf eure Hilfe, hier erst schonmal danke.
Meine Ausgangsstellung: Ich habe drei Tabellen "mitarbeiter", "kunden_allgemein", "kunden_anamesse"
Die beiden Tabellen "kunden_allgemein" und "kunden_anamesse" haben eine 1:1 Beziehnung.
Des weiteren habe ich noch eine Tabelle "authlog" in dieser speichere ich die Änderungen an den Tabellen.
Code: Alles auswählen
class KundenAllgemein(OptimisticLockingModel):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_column="id")
Code: Alles auswählen
class KundenAnamesse(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_column="id")
kunde = models.OneToOneField(KundenAllgemein, on_delete=models.CASCADE, db_column="id_kundeallgemein", related_name="anamesse")
Code: Alles auswählen
class Mitarbeiter(OptimisticLockingModel):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_column="id")
Code: Alles auswählen
# utils/optimistic_locking.py
class OptimisticLockingModel(models.Model):
row_id = models.UUIDField(default=uuid.uuid4, editable=False)
class Meta:
abstract = True
def save(self, *args, **kwargs):
if not self._state.adding:
self.row_id = uuid.uuid4()
super().save(*args, **kwargs)
die Änderungen beider Tabellen werden über einen Speicher Button gespeichert.
Jetzt zu dem Problem, wenn ich an der Tabelle "mitarbeiter" eine Änderung vornehme und diese speichere,
so bekomme ich einen Eintrag in der Tabelle "authlog" über die Änderung.
Das gleiche auch mit der Tabelle "kunden_anamesse".
Nur bei einer Änderung in der Tabelle "kunden_allgemein",
da werden in die Tabelle "authlog" zwei Einträge für die gleiche Änderung gespeichert.
Warum zwei? Einer genügt mir.
Hier noch weitere Code Snipsel:
Code: Alles auswählen
# apps/kunden_allgemein/forms.py
class KundenAllgemeinForm(OptimisticLockingFormMixin, SetChangedByMixin):
...
def save(self, commit=False, user=None):
# Wert aus ChoiceField zurück ins verschlüsselte Feld
self.instance.geschlecht = self.cleaned_data['geschlecht']
# super() liefert das Model-Objekt zurück, speichert aber NICHT
return super().save(commit=False, user=user)
Code: Alles auswählen
# utils/forms.py
from django import forms
from django.core.exceptions import ValidationError
class OptimisticLockingFormMixin(forms.ModelForm):
row_id = forms.UUIDField(widget=forms.HiddenInput(), required=False, label="")
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and not self.instance._state.adding:
self.fields['row_id'].initial = self.instance.row_id
def clean(self):
cleaned_data = super().clean()
if not self.instance._state.adding:
form_row_id = cleaned_data.get("row_id")
db_row_id = type(self.instance).objects.filter(pk=self.instance.pk).values_list("row_id", flat=True).first()
if db_row_id != form_row_id:
raise ValidationError("Der Datensatz wurde zwischenzeitlich von einem anderen Benutzer geändert.")
return cleaned_data
class SetChangedByMixin(forms.ModelForm):
def save(self, commit=True, user=None):
print("KundenAllgemein save(), row_id:", self.instance.row_id)
obj = super().save(commit=False)
if user is not None:
obj.changed_by = user
if commit:
obj.save()
return obj
Danke