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
в вашей модели является ненулевым и уникальным, поэтому убедитесь, что он обязателен и уникален.