在Django-Rest-Framework中创建第二个视频时出现Bad Request错误求助
Django+React开发YouTube克隆时创建第二个视频返回Bad Request错误
我正在用Django和React开发一个YouTube克隆项目。当用户创建第二个视频时,系统返回Bad Request错误,请求数据如下:
return (<QueryDict: {'title': ['Edit Test56'], 'description': ['is It working1643'], 'user': ['3'], 'image': [<TemporaryUploadedFile: slackphot.png (image/png)>], 'video': [<TemporaryUploadedFile: video-for-fatube.mp4 (video/mp4)>]}> )
错误路径为/api/admin/create/,使用Postman发送POST请求时也出现相同错误。
相关代码
views.py API视图
class CreateVideo(APIView): #permissions_classes = [IsAuthenticated] parser_classes = [MultiPartParser, FormParser] def post(self, request, format=None): print(request.data) serializer = VideoSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.py 视频序列化器
class VideoSerializer(serializers.ModelSerializer): user_name = CharField(source="user.user_name", read_only=True) class Meta: model = Video fields = ["id", "title", "image", "video", "description", "date_added", "is_active", "user", "user_name", "likes"]
models.py 视频模型
class Video(models.Model): title = models.CharField(max_length=50) image = models.ImageField(_("Image"), upload_to=upload_to, default="videos/default.jpg") video = models.FileField(_("Video"), upload_to=upload_to, default="videos/default.mp4") user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="user_channel" ) description = models.CharField(max_length=255) likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='video_post', null=True, blank=True) date_added = models.DateTimeField(default=timezone.now) is_active = models.BooleanField(default=True)
问题原因
核心问题出在Video模型的user字段:你使用了OneToOneField,这意味着一个用户只能关联一个视频。当用户创建第二个视频时,数据库会触发唯一性约束校验,导致序列化器验证失败,返回400 Bad Request错误。
解决方案
将models.py中的user字段从OneToOneField改为ForeignKey(一对多关系,符合一个用户可上传多个视频的业务逻辑):
user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="user_channel" )
修改完成后,执行数据库迁移命令更新表结构:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者PHILLIPP APETENOK
相关产品推荐
相关产品推荐

