gpt4 book ai didi

Django Rest Framework 在序列化之前更新数据

转载 作者:行者123 更新时间:2023-12-01 22:50:12 27 4
gpt4 key购买 nike

我希望任何用户都可以使用我的 RESTful API 创建自己的产品。为此,我创建了一个继承ListCreateAPIView的 View 。问题是用户应该只创建他/她拥有的产品,因此当创建 Product 模型的实例时,我希望字段 Owner 对应于经过身份验证的用户。

这是我的产品型号

class Product(models.Model):
owner = models.ForeignKey(User)
name = models.CharField(max_length=30)

显然我的序列化器是:

class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = models.Product

以及我的观点:

class ProductView(generics.ListCreateAPIView):
queryset = models.Product.objects.all()
serializer_class = serializers.ProductSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)

def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
#serializer.initial_data['owners'] = models.Person.objects.get(user__email=request.user).user_id
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)

return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

正如你所看到的,我尝试修改“initial_data”,但它是一个 QueryDict,它是不可变的。另一种选择是将其转换为 Python 字典,然后添加“owner”值,但这样做时我将每个值作为列表获取(即 {'name': ['MyName']}),所以这将是一个非常好的选择。解决问题的方法很丑陋,我认为这应该是一个更直接的解决方案。

最佳答案

您可以重写perform_create()并将当前用户作为所有者传递。然后,当创建 Product 实例时,owner 字段将与当前用户值一起保存。

class ProductView(generics.ListCreateAPIView):
queryset = models.Product.objects.all()
serializer_class = serializers.ProductSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)

def perform_create(self, serializer):
serializer.save(owner=self.request.user) # pass the current user as the 'owner'

此外,您应该在序列化程序中owner 字段定义为 read_only 。那么反序列化时就不需要该字段了。但是,该字段将包含在序列化的输出中。

 class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = models.Product
extra_kwargs = {'owner': {'read_only':True}} # set 'owner' as read-only field

关于Django Rest Framework 在序列化之前更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38167133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com