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
Вернуться на верх