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。我想允许经过身份验证的用户发布对UserContentItem
具有FK依赖关系的新User
,但是User
不是POST负载的一部分。我能够弄清楚如何做到这一点的唯一方法是如上所述,将request.user.id
添加到请求数据中,然后再传递给序列化程序。是否有更好的方法来序列化UserContentItem
并实现相同的目标?
答案 0 :(得分:0)
我认为您可以使用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。
答案 1 :(得分:0)
即使您可以遵循这些方法,您的方法也很好
serializer.save(owner=self.request.user)