【问题标题】:Django rest setting the one to one relation creating an post methodDjango rest设置一对一关系创建一个post方法
【发布时间】:2022-02-07 17:56:15
【问题描述】:

我是 django 新手,我创建了具有 OnetoOne 关系的模型,我有用户表,并且我与 storyboard 库表有 onetoone 关系,问题是当我创建一个 storyboardlibraby 对象时,我需要保存用户对象onetoonefield,即使添加了无法将故事板库保存到数据库的用户对象,如果有人可以帮助我,请帮助我,我将添加我编写的代码。

class StoryboardLibrary(models.Model):
   name = models.CharField(max_length=50)
   data = JSONField(db_index=True)
   user = models.OneToOneField(User, on_delete=models.CASCADE)

   def __str__(self):
       return "%s The Library" % self.name

序列化程序类

class StoryboardSerializer(serializers.ModelSerializer):
class Meta:
    model = StoryboardLibrary
    fields = ('data','name','user')

查看发布方式

def add_storyboard(request):
# validating for already existing data
if StoryboardLibrary.objects.filter(**request.data).exists():
    raise serializers.ValidationError('This data already exists')
user = get_object_or_404(User, id=request.user.id)
request.data['user'] = user
storyboard = StoryboardSerializer(data=request.data)
print(storyboard)
if storyboard.is_valid():
    storyboard.save()
    return Response(storyboard.data, status=status.HTTP_201_CREATED)
else:
    return Response(status=status.HTTP_404_NOT_FOUND)

点击 post api 后,我无法保存数据 storyboardserializer 无效,因此它正在执行 else 块并返回状态 404 not found

【问题讨论】:

    标签: python django django-rest-framework django-rest-viewsets


    【解决方案1】:

    所以, 在这里,您正在使用请求的用户进行过滤,所以

    get_object_or_404
    

    不是必需的,因为如果请求来了,就会有一个用户和一个 id。

    request.data 也是不可变的,你不能改变它。因此您不能将自己的用户添加(修改)到收到的数据中。

    request.data['user'] = user
    

    您可以将上下文传递给您的序列化程序

    storyboard = StoryboardSerializer(data=request.data, context = {'request':request})
    

    并在创建序列化方法中保存用户或直接将用户另存为-

    storyboard.save(user=request.user.id)
    

    【讨论】:

    • 如果您使用 storyboard.save(user=request.user.id) 如果您的用户是必填字段,您的序列化验证将失败,在序列化程序中,您可以获得请求对象并从中获取用户或仅将用户作为上下文传递
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多