DRF 使用用户 FK 序列化和保存模型
DRF serialize and save model with user FK
models.py
class UserContentItem(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
created_date = models.DateTimeField(default=timezone.now)
views.py
class UserContentItemView(APIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
def post(self, request, format=None):
data = request.data
data['owner'] = request.user.id
serializer = UserContentItemSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class UserContentItemSerializer(serializers.ModelSerializer):
class Meta:
model = UserContentItem
fields = ('id', 'owner', 'title', 'created_date')
我正在使用 Django Rest Framework 和简单的 jwt 构建一个 API。我想允许经过身份验证的用户 POST 一个新的 UserContentItem
,它对 User
具有 FK 依赖性,但 User
不是 POST 负载的一部分。我能够弄清楚如何执行此操作的唯一方法是如上所述,在将请求数据传递给序列化程序之前将 request.user.id
添加到请求数据中。有没有更好的方法来序列化 UserContentItem
并实现相同的目标?
我想你可以这样尝试 CurrentUserDefault:
class UserContentItemSerializer(serializers.ModelSerializer):
owner = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserDefault()
)
class Meta:
model = UserContentItem
fields = ('id', 'owner', 'title', 'created_date')
并且在视图中,将请求作为上下文传递给序列化程序:
serializer = UserContentItemSerializer(data=data,context={'request':request})
此外,您不需要使用 data
传递用户 ID。
你的方法很好,即使你可以遵循这些
serializer.save(owner=self.request.user)
models.py
class UserContentItem(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
created_date = models.DateTimeField(default=timezone.now)
views.py
class UserContentItemView(APIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
def post(self, request, format=None):
data = request.data
data['owner'] = request.user.id
serializer = UserContentItemSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class UserContentItemSerializer(serializers.ModelSerializer):
class Meta:
model = UserContentItem
fields = ('id', 'owner', 'title', 'created_date')
我正在使用 Django Rest Framework 和简单的 jwt 构建一个 API。我想允许经过身份验证的用户 POST 一个新的 UserContentItem
,它对 User
具有 FK 依赖性,但 User
不是 POST 负载的一部分。我能够弄清楚如何执行此操作的唯一方法是如上所述,在将请求数据传递给序列化程序之前将 request.user.id
添加到请求数据中。有没有更好的方法来序列化 UserContentItem
并实现相同的目标?
我想你可以这样尝试 CurrentUserDefault:
class UserContentItemSerializer(serializers.ModelSerializer):
owner = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserDefault()
)
class Meta:
model = UserContentItem
fields = ('id', 'owner', 'title', 'created_date')
并且在视图中,将请求作为上下文传递给序列化程序:
serializer = UserContentItemSerializer(data=data,context={'request':request})
此外,您不需要使用 data
传递用户 ID。
你的方法很好,即使你可以遵循这些
serializer.save(owner=self.request.user)