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
