【发布时间】:2020-08-22 17:42:43
【问题描述】:
我有这个模型:
class Comment(models.Model):
user = models.ForeignKey('users.User', on_delete=models.CASCADE, null=False)
post = models.ForeignKey('posts.Post', on_delete=models.CASCADE, null=False)
content = models.TextField(max_length=1000, null=False, blank=False)
def __str__(self):
"""Return the comment str."""
return "'{}'".format(self.content)
它的序列化器看起来像这样:
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'
到目前为止,在检索数据方面做得很好,但是当我想 create 一个新的 Comment 时,这样做的正确方法是什么?
我的看法:
class CommentViewSet(viewsets.ModelViewSet):
def get_permissions(self):
permissions = []
if self.action == 'create':
permissions.append(IsAuthenticated)
return [p() for p in permissions]
def create(self, request):
"""Create a comment in some post."""
serializer = CommentSerializer(data=request.data)
if serializer.is_valid(): # False because user value is missing.
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
没关系,我尝试覆盖 validate_user 并让它只是 pass,但是当我调用 is_valid 时验证仍在运行。我还尝试将request.user 附加到serializer.data,但它是不可变的。
如果我需要使用request.user,我怎么能做到这一点?我需要为序列化程序的该字段设置的值不在request.data 中。 (我认为让前端发送用户 ID 不是一个好主意)。
我想到的另一个解决方案是在serializer 中设置user 只读,然后在我调用save() 时将其添加到Django 对象中。但我想知道使用 DRF 更清洁、更安静的方法是什么。
【问题讨论】:
标签: python django api rest django-rest-framework