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