我正在尝试实现一个简单的终结点,以使用Django rest框架的ModelSerializer创建对象。我的模型具有用户模型的外键,我需要在端点发布功能中设置此值。
使用Django中的表单,您可以在帖子中的save方法中添加commit=false
,设置属性(instance.user = self.request.user)
,然后使用 save()方法。但是,我找不到使用Djago Rest Framework serlializaer的清晰明了的方法。
这是我的模特。
class Ticket(models.Model):
images_quantity = models.PositiveSmallIntegerField()
status = models.PositiveSmallIntegerField(
choices=TICKET_STATUS_CHOICES,
default=PENDING_TICKET,
)
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
created_at = models.DateTimeField(
auto_now_add=True,
)
因此,如您所见,User模型有一个外键。在我的发布端点中,必须使用经过身份验证的用户来填充此值。
看看序列化器:
class TicketSerializer(serializers.ModelSerializer):
class Meta:
model = Ticket
fields = ('images_quantity',)
用户仅必须发送images_quantity字段值。因此,我需要创建一个票证模型的新实例,并将经过身份验证的用户ID设置为created_by
字段中的值。
这是我的观点:
class TicketFormView(APIView):
def post(self, request, format=None):
serializer = TicketSerializer(data=request.data)
if serializer.is_valid():
# Here is my problem. I need to set the created_by field before save.
serializer.save()
return Response(
serializer.data,
status=status.HTTP_200_OK,
)
return Response(
serializer.errors,
status=status.HTTP_400_BAD_REQUEST,
)
如果我发送帖子,则会收到"null value in column "created_by_id" violates not-null constraint"
错误,这是因为我需要在此字段中设置经过身份验证的用户ID。我该怎么办?
答案 0 :(得分:2)
将created_by添加到序列化器的字段列表中,然后您可以轻松地将已认证的用户传递给序列化器的save方法:
serializer.save(created_by=request.user)
但是我建议您利用rest框架的泛型并执行以下操作:
from rest_framework import generics, serializers
from rest_framework.permissions import IsAuthenticated
class TicketFormView(generics.CreateAPIView):
serializer_class = TicketSerializer
queryset = Ticket.objects.all()
permission_classes = ( IsAuthenticated, )
def perform_create(self, serializer):
serializer.save(created_by=self.request.user)
通过这种方式,您不必自己实现任何post方法,因为这是您完成操作的非常标准的方法。
答案 1 :(得分:1)
用户 PrimaryKeyRelatedField
和 CurrentUserDefault
为
class TicketSerializer(serializers.ModelSerializer):
created_by = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all(),
default=serializers.CurrentUserDefault()
)
class Meta:
model = Album
fields = ('images_quantity', 'created_by')
这里User.objects.all()
应该是您的settings.AUTH_USER_MODEL
的{{1}}
参考
1. CurrentUserDefault
2. PrimaryKeyRelatedField