IntegrityError at /api/course/ (1048, "Column 'category_id' cannot be null")
Всем привет, мне нужна помощь по этой проблеме в Django *IntegrityError at /api/course/ (1048, "Column 'category_id' cannot be null") Я получил следующее, когда я пытался вставить новый курс *
class Course(models.Model):
category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE)
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE , related_name='teacher_courses')
title = models.CharField(max_length=150)
description = models.TextField()
featured_img = models.ImageField(upload_to='course_imgs/',null=True)
techs = models.TextField(null=True)
class Meta:
verbose_name_plural = "3. Courses"
def related_content(self):
related_content=Course.objects.filter(techs__icontains=self.techs)
return serializers.serialize('json',related_content)
def tech_list(self):
tech_list = self.techs.split(',')
return tech_list
def __str__(self):
return self.title
class CourseList(generics.ListCreateAPIView):
queryset = models.Course.objects.all()
serializer_class = CourseSerializer
def get_queryset(self):
qs = super().get_queryset()
if 'result' in self.request.GET:
limit = int(self.request.GET['result'])
qs = models.Course.objects.all().order_by('-id')[:limit]
if 'category' in self.request.GET:
category = self.request.GET['category']
qs = models.Course.objects.filter(techs__icontains=category)
if 'skill_name' in self.request.GET and 'teacher' in self.request.GET:
skill_name = self.request.GET['skill_name']
teacher = self.request.GET['teacher']
teacher = models.Teacher.objects.filter(id=teacher).first()
qs = models.Course.objects.filter(techs__icontains=skill_name,teacher=teacher)
return qs
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = models.Course
fields =['id','title','description','category_id','teacher','featured_img','techs','course_chapters','related_content','tech_list']
depth=1
Я искал решение в течение нескольких часов, но я не получил никакого способа решить проблему, и я ожидаю, что вы поможете мне, спасибо
ошибка целостности - это ошибка базы данных, вы пытаетесь ввести объект Course, не указав (в вашем случае), с каким объектом CourseCategory связан объект Course. Вот документы. Вам придется выбрать существующую категорию CourseCategory, с которой будет связан курс.
Проблема находится в вашем поле category
в Course
модели.
category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE)
Вы не присвоили своему полю ни одного объекта CourseCategory
. Если это была ошибка, вам следует присвоить CourseCategory
, иначе, если вы хотите определить, может ли CourseCategory
быть принят как null
, вам следует изменить эту строку на:
category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE, blank=True, null=True)
Кроме того, вам необходимо изменить category_id
в вашем сериализаторе на category
. Если поля вашего сериализатора не являются пользовательскими, они должны соответствовать именам полей соответствующей модели.
Проблема была вызвана глубиной=1 внутри класса CourseSerializer, чтобы решить эту проблему, мне пришлось создать 2 класса Serializers один для вставки в базу данных, который не содержит глубину=1, а другой для получения данных из базы данных, который содержит глубину=1, потому что моя модель курса имеет связь с моделью категории`
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = models.Course
fields = ['id','title','description','category_id','teacher','featured_img','techs','course_chapters','related_content','tech_list','total_enrolled_students']
depth=1
class CourseInSerializer(serializers.ModelSerializer):
class Meta:
model = models.Course
fields = ['id','title','description','category','teacher','featured_img','techs']
`
После того как вы определили глубину, вам нужно написать собственное создание и обновить методы, которые будут обрабатывать изменение вложенных полей.
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = models.Course
fields = ['id','category','teacher','title','description','course_image','technologicals','course_chapters','related_courses','technological_list','total_enrolled_students']
# depth = 1
def __init__(self, *args, **kwargs):
super(CourseSerializer, self).__init__(*args, **kwargs)
request = self.context.get('request')
self.Meta.depth = 0
if request and request.method == 'GET':
self.Meta.depth = 1