我如何处理 Django 嵌套模型?
How can i handle django nested models?
我在 Django 中有一个用户、Post 和标签模型。标记模型与本主题无关。我可以使用嵌套对象将所有数据获取到前端。另一方面,当我想创建一个新的 post 时,我将 post 数据发送到 django,在 django 视图中,我试图通过将登录用户与 "Post" 相关联来更新数据但是当我这样做时,它给了我;
{'owner': {'username': [ErrorDetail(string='A user with that username already exists.', code='unique')]}}
错误。我该如何解决这个错误?
models.py;
class Post(models.Model):
# Post specs
title = models.CharField(max_length=100, null=False)
place = models.CharField(max_length=100, null=False)
notes = models.CharField(max_length=10000, null=False)
tags = models.ManyToManyField(Tag)
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
created_at = models.DateField(auto_now=True)
owner = models.ForeignKey(User , null = True, on_delete=models.SET_NULL)
serializers.py;
class PostSerializer(serializers.ModelSerializer):
tags = serializers.SlugRelatedField(
many=True,
queryset=Tag.objects.all(),
slug_field='name'
)
owner = UserSerializer()
class Meta:
model = Post
fields = ('title','place','notes','start_date','end_date','created_at','id','owner','tags')
顺便说一下,如果我改变 serializer.py
所有者 = UserSerializer
它只给出主键值。在前端,我不能用整数来处理任何事情,我不想再对用户模型进行 api 调用。最后查看 post 函数;
def post(self, request, format =None):
"""
Creates a post
"""
post = request.data ## copy dictionary to a variable
authenticatedUserDataAsDict = request.user.__class__.objects.filter(pk=request.user.id).values().first()
post.update( {'owner': authenticatedUserDataAsDict} ) ## attach authenticated user to post end
serializer = PostSerializer(data = post) ## serialize the dict
if serializer.is_valid():
serializer.save() ## if data valid save it.
return Response(serializer.data, status = status.HTTP_201_CREATED)
print("not valid->",serializer.errors)
return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST) # if it's not raise http 400
已解决
你好,rest 框架似乎不知道我们的请求(创建或获取),因为我们正在处理嵌套的序列化程序。
所以我在媒体上找到了 this 篇文章,它帮助我解决了我的问题。
我在 Django 中有一个用户、Post 和标签模型。标记模型与本主题无关。我可以使用嵌套对象将所有数据获取到前端。另一方面,当我想创建一个新的 post 时,我将 post 数据发送到 django,在 django 视图中,我试图通过将登录用户与 "Post" 相关联来更新数据但是当我这样做时,它给了我;
{'owner': {'username': [ErrorDetail(string='A user with that username already exists.', code='unique')]}}
错误。我该如何解决这个错误?
models.py;
class Post(models.Model):
# Post specs
title = models.CharField(max_length=100, null=False)
place = models.CharField(max_length=100, null=False)
notes = models.CharField(max_length=10000, null=False)
tags = models.ManyToManyField(Tag)
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
created_at = models.DateField(auto_now=True)
owner = models.ForeignKey(User , null = True, on_delete=models.SET_NULL)
serializers.py;
class PostSerializer(serializers.ModelSerializer):
tags = serializers.SlugRelatedField(
many=True,
queryset=Tag.objects.all(),
slug_field='name'
)
owner = UserSerializer()
class Meta:
model = Post
fields = ('title','place','notes','start_date','end_date','created_at','id','owner','tags')
顺便说一下,如果我改变 serializer.py 所有者 = UserSerializer 它只给出主键值。在前端,我不能用整数来处理任何事情,我不想再对用户模型进行 api 调用。最后查看 post 函数;
def post(self, request, format =None):
"""
Creates a post
"""
post = request.data ## copy dictionary to a variable
authenticatedUserDataAsDict = request.user.__class__.objects.filter(pk=request.user.id).values().first()
post.update( {'owner': authenticatedUserDataAsDict} ) ## attach authenticated user to post end
serializer = PostSerializer(data = post) ## serialize the dict
if serializer.is_valid():
serializer.save() ## if data valid save it.
return Response(serializer.data, status = status.HTTP_201_CREATED)
print("not valid->",serializer.errors)
return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST) # if it's not raise http 400
已解决
你好,rest 框架似乎不知道我们的请求(创建或获取),因为我们正在处理嵌套的序列化程序。 所以我在媒体上找到了 this 篇文章,它帮助我解决了我的问题。