Django.db.utils.IntegrityError: null значение в столбце "auto_id" отношения "university_university" нарушает ограничение not-null

Я получаю ошибку целостности, я пробовал добавить null=True в поле auto id, тогда оно работает, но поле auto_id не должно быть blank=True или null=True. Эти модели даны моим начальством, мне трудно понять это

Это основное приложение models.py

Это университетский models.py

from django.db import models
from core.models import BaseModel

from versatileimagefield.fields import VersatileImageField

# Create your models here.
class Graduation(BaseModel):    
    name = models.CharField(max_length=200)

    class Meta:
        db_table = 'university_graduation'
        verbose_name = ('Graduation')
        verbose_name_plural = ('Graduation')
        ordering = ('auto_id',)

    def __str__(self):
        return str(self.name)


class University(BaseModel):
    title = models.CharField(max_length=200)
    location = models.CharField(max_length=200)
    location_url = models.URLField()
    estd = models.CharField(max_length=4)
    ranking = models.CharField(max_length=4)
    intake = models.CharField(max_length=3)
    acceptance_rate = models.CharField(max_length=3)
    teacher_ratio = models.CharField(max_length=3)
    about_university = models.TextField()
    description = models.TextField()
    graduation = models.ManyToManyField(Graduation)
    logo = VersatileImageField('Logo', upload_to="university/logo")
    image = VersatileImageField('Image', upload_to="university/image")

    class Meta:
        db_table = 'university_university'
        verbose_name = ('University')
        verbose_name_plural = ('University')
        ordering = ('auto_id',)

    def __str__(self):
        return str(self.title)
    
class AdmissionRequirments(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    auto_id = models.PositiveIntegerField(db_index=True, unique=True)
    date_added = models.DateTimeField(db_index=True, auto_now_add=True)
    date_updated = models.DateTimeField(auto_now_add=True)
    
    university = models.ForeignKey(University, limit_choices_to={'is_deleted': False}, on_delete=models.CASCADE)
    requirement = models.CharField(max_length=200)

    class Meta:
        db_table = 'university_admission_requirements'
        verbose_name = ('Admission Requirements')
        verbose_name_plural = ('Admission Requirements')
        ordering = ('auto_id',)

    def __str__(self):
        return str(self.id)

class Scholarship(BaseModel):
    title = models.CharField(max_length=200)
    eligibility = models.CharField(max_length=200)
    applicability = models.CharField(max_length=200)
    graduation = models.ManyToManyField(Graduation)
    university = models.ManyToManyField(University)

    class Meta:
        db_table = 'university_scholarship'
        verbose_name = ('Scholarship')
        verbose_name_plural = ('Scholarship')
        ordering = ('auto_id',)

    def __str__(self):
        return str(self.title)

Это университет form.py

from django.forms import forms
from university.models import University, Graduation
from django.contrib.auth.models import User
from django.contrib.auth import get_user

class CreateUniversityForm(forms.Form):
    class Meta:
        model = University
        fields = '__all__'

    def save(self):
        user = self.cleaned_data.get("user")
        university = University(
                        auto_id = self.cleaned_data.get('id'),
                        title = self.cleaned_data.get('title'),
                        location = self.cleaned_data.get('location'),
                        location_url = self.cleaned_data.get('location_url'),
                        estd = self.cleaned_data.get('estd'),
                        ranking = self.cleaned_data.get('ranking'),
                        intake = self.cleaned_data.get('intake'),
                        acceptance_rate = self.cleaned_data.get('acceptance_rate'),
                        teacher_ratio = self.cleaned_data.get('teacher_ratio'),
                        about_university = self.cleaned_data.get('about_university'),
                        description = self.cleaned_data.get('description'),
                        logo = self.cleaned_data.get('logo'),
                        image = self.cleaned_data.get('image')
        )

        graduation = Graduation.objects.get(name=self.cleaned_data.get("graduation"))
        university.set_graduation = graduation

        university.set_creator = user
        university.set_updator = user
        university.save()

        return university

Это мой университет view.py для создания университета

def create_university(request):
    if request.method == 'POST':
        user = get_user(request)
        logo = request.FILES.get('logo')
        image = request.FILES.get('image')
        auto_id = int(request.POST.get('id'))
        title = request.POST.get('title')
        graduation = "berlin"
        location = request.POST.get('location')
        location_url = request.POST.get('location_url')
        established = request.POST.get('established')
        ranking = request.POST.get('ranking')
        intake = request.POST.get('intake')
        acceptance_rate = request.POST.get('acceptance')
        teacher_ratio = request.POST.get('teacher')
        about_university = request.POST.get('about')
        description = request.POST.get('description')

        data = {
            'user': user,
            'title': title,
            'id': auto_id,
            'location': location,
            'location_url': location_url,
            'estd': established,
            'ranking': ranking,
            'intake': intake,
            'acceptance_rate': acceptance_rate,
            'teacher_ratio': teacher_ratio,
            'about_university': about_university,
            'description': description,
            'logo': logo,
            'image': image,
            'graduation': graduation}

        print(data)

        create_university_form = CreateUniversityForm(data=data)

        if create_university_form.is_valid():
            university = create_university_form.save()
            context = {
                'title': university.title
            }
            
            return JsonResponse(context)
        else:
            context = {
                "validationerror": "validation error"
            }
            return JsonResponse(context)

университетская модель admin view

Все, что я хотел сделать, это создать новый объект univerisity, но этот auto_id убивает меня, также я не могу понять эту систему BaseModel

  File "C:\Users\abinp\Documents\projects\tegain\venv\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: null value in column "auto_id" of relation "university_university" violates not-null constraint
DETAIL:  Failing row contains (c496cf2f-2966-49f3-b2d4-9efa4f3323b4, null, 2022-08-08 10:36:59.869385+00, 2022-08-08 10:36:59.869385+00, f, null, null, null, null, null, null, null, null, null, null, , , null, null).

Как говорит ошибка, у вас нулевое значение в столбце ID.

auto_id = models.PositiveIntegerField(db_index=True, unique=True)

У вас есть PositiveIntegerField, это означает, что вы должны заполнить его, и вы, вероятно, не делаете этого в формах. Для идентификатора вы всегда должны использовать AutoField.

Так что он возвращает null, потому что в вашей переменной auto_id ничего нет. Я думаю, что замена этого на AutoField должна решить проблему.

Поиск документации для AutoField: https://docs.djangoproject.com/en/4.1/ref/models/fields/

Вы передаете auto_id как id внутри диктанта, поэтому замените id на auto_id.


data = {
    "user": user,
    "title": title,
    "auto_id": auto_id,
    "location": location,
}

Также auto_id в вашей модели является ненулевым и уникальным, поэтому убедитесь, что он обязателен и уникален.

Вернуться на верх