[SQLite][Django] FOREIGN KEY constraint failed

Odpowiedz Nowy wątek
2019-08-13 11:00
0

Czy w tej bazie danych są jakieś błędy? Przy usuwaniu rekordów otrzymuję komunikat 'FOREIGN KEY constraint failed'

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
from django.contrib.auth.models import User
from django.db.models.signals import post_save
import datetime

class ClassCode(models.Model):
    code = models.CharField(max_length=5)

class Role(models.Model):
    name = models.CharField(max_length=100)

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    pass_changed = models.BooleanField(default=False)
    role_fk = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True, blank=True)
    class_code = models.ForeignKey(ClassCode, on_delete=models.CASCADE)

class Year(models.Model):
    year = models.IntegerField(validators=[MinValueValidator(2000), MaxValueValidator(2099)], default=datetime.datetime.now().year)
    class_code = models.ForeignKey(ClassCode, on_delete=models.CASCADE)

class MonthPayment(models.Model):
    student_fk = models.ForeignKey(Student, on_delete=models.CASCADE)
    class_code = models.ForeignKey(ClassCode, on_delete=models.CASCADE)
    month = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(9)])
    year_fk = models.ForeignKey(Year, on_delete=models.CASCADE)

class Event(models.Model):
    class_code = models.ForeignKey(ClassCode, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    date = models.DateField(blank=True, null=True)
    value = models.DecimalField(decimal_places=2, max_digits=6, validators=[MinValueValidator(0)])

class EventPayment(models.Model):
    event_fk = models.ForeignKey(Event, on_delete=models.CASCADE)
    student_fk = models.ForeignKey(Student, on_delete=models.CASCADE)
    paid = models.BooleanField(default=False)

def create_student(sender, instance, created, **kwargs): # to jest hard coded
    if created:
        Student.objects.create(id=instance.id, user=instance, class_code_id=1, role_fk_id=1)

post_save.connect(create_student, sender=User)

Pozostało 580 znaków

2019-08-13 11:09
0

Ten błąd oznacza, że któraś tabela zawiera wiersze, których klucz obcy odwołuje się do wartości primary key innej tabeli.
Edit. https://www.sqlite.org/foreignkeys.html

edytowany 1x, ostatnio: Dregorio, 2019-08-13 11:10

Pozostało 580 znaków

2019-08-13 11:16
0

a dokładniej usuwasz wiersze do których przez FK odwołują się inne wiersze - np. próbujesz usunąć nagłówek dokumentu do którego są pozycje


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2019-08-13 11:28
0
abrakadaber napisał(a):

a dokładniej usuwasz wiersze do których przez FK odwołują się inne wiersze - np. próbujesz usunąć nagłówek dokumentu do którego są pozycje

Ale właśnie po to ustawiam on_delete=models.CASCADE. Czy źle rozumiem ideę usuwania kaskadowego?

Pozostało 580 znaków

2019-08-13 15:55
0

Wrzuć model i przykładowe dane na sqlfiddle.

Pozostało 580 znaków

2019-08-13 16:38
0
yarel napisał(a):

Wrzuć model i przykładowe dane na sqlfiddle.

Miałem problemy z dodaniem na stronkę w załączniku trzymaj bazę danych i jego sql.

  • db.7z (0,01 MB) - ściągnięć: 10
edytowany 1x, ostatnio: bartox;, 2019-08-13 16:38

Pozostało 580 znaków

2019-08-13 21:55
0

ale tam nigdzie na FK nie masz ustawionego ON DELETE (w sensie w SQLu). Wygląda na to jakby on_delete=models.CASCADE działało wyłącznie po stronie pythona a nie SQLa ale mogę się mylić


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber, 2019-08-13 22:01

Pozostało 580 znaków

2019-08-13 22:08
0

Wygląda na to jakby on_delete=models.CASCADE działało wyłącznie po stronie pythona a nie SQLa ale mogę się mylić

https://docs.djangoproject.co[...]lds/#django.db.models.CASCADE

Cascade deletes. Django emulates the behavior of the SQL constraint ON DELETE CASCADE and also deletes the object containing the ForeignKey.

Dokładnie tak działa.
@bartox; Przy jakim zapytaniu dostajesz ten błąd?

edytowany 1x, ostatnio: Delor, 2019-08-13 22:14

Pozostało 580 znaków

2019-08-13 22:18
0
Delor napisał(a):

@bartox; Przy jakim zapytaniu dostajesz ten błąd?

Zawsze gdy chcę usunąć rekordy połączone kluczem obcym (powinny usuwać się kaskadowo).

edytowany 1x, ostatnio: bartox;, 2019-08-13 22:18

Pozostało 580 znaków

2019-08-13 22:19
0

@bartox;: chodzi o to czy usuwasz "czystym" SQLem czy przez django


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2019-08-13 22:20
0
abrakadaber napisał(a):

@bartox;: chodzi o to czy usuwasz "czystym" SQLem czy przez django

W django, panelu administratora.

@bartox;: a który (przykładowo) rekord usuwasz i spodziewasz się kaskadowego usuwania? - yarel 2019-08-13 22:28
@yarel: obojętnie który czy wbudowany w django user czy np. utworzony przeze mnie class code błąd ten sam - bartox; 2019-08-13 22:30

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0