【发布时间】:2017-12-29 04:25:13
【问题描述】:
我希望我的访问者具有创建和获取提案列表的功能。
用户发送除了提案作者之外的所有数据(因为身份验证是用户自己),所以我试图用 request.user 扩展 request.data 像这样:
# proposals/views.py
class ProposalsList(ListCreateAPIView):
permission_classes = (IsAuthenticatedOrReadOnly,)
queryset = Proposal.objects.all()
serializer_class = ProposalSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data={
**request.data,
"author": request.user.id,
})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
虽然,我想获取带有序列化作者(用户)的提案列表,所以我的序列化器看起来像:
# proposals/serializers.py
class ProposalSerializer(serializers.ModelSerializer):
author = UserSerializer()
class Meta:
model = SeekerProposal
fields = ('text', 'author')
问题是我正确获取用户列表(序列化为字典),但我无法发布(创建新)提案,因为它想“作者”成为字典(它发生了因为我使用的是嵌套序列化器 author = UserSerializer())。
问题:
- 有没有办法让 view 成为 ListCreateAPIView 和 author = UserSerializer() 而 GET 包含序列化数据的列表并通过 request.user.id 创建提案?
- 也许还有其他方法可以将授权用户添加到提案作者字段?
另外,这是我的模型:
# proposals/models.py
class Proposal(models.Model):
text = models.TextField(blank=False, null=False)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET(get_sentinel_user),
)
回答
用户@zaidfazil 帮助我解决了问题。 我只需要在我的序列化程序中添加一个额外的字段,以便显示作者详细信息:
# proposals/serializers.py
class ProposalSerializer(serializers.ModelSerializer):
author_details = UserSerializer(source='author', read_only=True)
class Meta:
model = SeekerProposal
# author will be user id, and author_details will be serialized dict
fields = ('text', 'author', 'author_details')
因为author 仍然只是用户ID,而author_details 是read_only=True 我将在GET 请求中获取作者的所有数据,并且可以通过author=request.user.id 创建新提案。
一瞬间:
我没有在author 字段上使用blank=True,因为我必须确保该字段不为空。所以我的观点看起来和我上面写的一样(postProposalsList)。
再次感谢@zaidfazil!如果我写错了请写信给我,我在 stackoverflow 上有点菜鸟。
【问题讨论】:
-
某种答案是创建名为 ProposalNestedSerializer 的新序列化程序,它继承我的 ProposalSerializer 并扩展 author = UserSerializer(),同时将其从 ProposalSerializer 中删除。所以现在,我将 ProposalNestedSerializer 用于 GET(并获取序列化作者作为响应)并将 ProposalSerializer 与 POST 一起使用(并且可以仅使用 request.user.id 创建提案)
标签: django model django-rest-framework authorization