Warum zwei Einträge in der Tabelle "authlog"

Django, Flask, Bottle, WSGI, CGI…
Antworten
PythonNoob123
User
Beiträge: 3
Registriert: Samstag 23. November 2024, 11:37

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.

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")
Hier das OptimisticLockingModel:

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 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:

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
Ich hoffe ihr könnt mir weiterhelfen, ich habe schon gefühlt alles umgestellt, abgefragt und ausprobiert.
Danke
Antworten