Django OneToOne Relation - on_delete - Problem

Django, Flask, Bottle, WSGI, CGI…
Antworten
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

Hallo Django´s,

ich setzte gerade mit Django eine kleine Datenbankapplikation auf und komme in einer Sache nicht weiter.

Grunsätzlich geht es um das Löschverhalten zwischen zwei "models", deren Tabellen in einer 1:1 Beziehung stehen.
Meine Anwendung enthält User, diese User sollen eine privat Adresse haben.
Dafür habe ich jeweils ein model(Tabelle) angelegt. Also ein User Model und ein Adress Model.

Wenn ich nun einen User lösche, soll seine in 1:1 Beziehung gespeicherte Adresse mitgelöscht werden. Ich habe verschiedene on_delete Optionen ausprobiert.
Aber es funktioniert nicht, so wie ich es gerne hätte. Wenn ich einen User lösche, bleibt die dazughörige Adresse in der Adress Tabelle als "Leiche" stehen.
Nur wenn ich im Django Admin Backend zu den Adressen gehe und die Adresse dort lösche, wird der dazugehörige User mitgelöscht.
Ich hätte aber gerne das genau gegenteiliege verhalten. Ich möchte eine Adresse löschen können, ohne das der User mitgelöscht wird und nur wenn ich den User selbst lösche, soll die Adresse mitgelöscht werden.

Da es eigentlich funktioniert, nur falsch herum, denke ich das sollte irgendwie gehen ? aber ich bekomme es nicht hin. Hier mein relevanter code dazu:

Code: Alles auswählen

class CustomUser(AbstractUser):
    birth_date = models.DateField("Geburtsdatum", unique=False, null=True, blank=True)
    mobile_number = PhoneNumberField(
        "Handy Nummer", unique=False, null=True, blank=True
    )
    phone_number = PhoneNumberField(
        "Festnetz Nummer", unique=False, null=True, blank=True
    )
    private_address = models.OneToOneField(
        Address,
        verbose_name="Privat-Adresse",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
    )
    
    
class Address(models.Model):
    street_name = models.CharField("Straße", max_length=40, blank=False)
    street_number = models.PositiveIntegerField("Hausnummer", blank=False)
    zip_code = models.PositiveIntegerField("Postleitzahl", blank=False)
    city = models.CharField("Stadt", max_length=40, blank=False)
    country = models.CharField("Land", max_length=40, blank=True)
    additional_info = models.TextField(
        "Zusatz Info Adresse", max_length=100, blank=True
    )
    
    

ich freue mich auf einen Hinweis.
viele Grüße
gomeZ
Antworten