我需要分配ForeignKey给对象而无需在Serializer课堂上使用它。这是我的案例的过度简化版本:
我有名为Company,User和的模型Order:
class Company(models.Model):
...
class User(AbstractBaseUser)
company = models.ForeignKey('Company', null=False)
...
class Order(models.Model):
company = models.ForeignKey('Company', null=False)
some_other_field = ...
...
这样可以有多个Companies,每个Company可以有多个users和orders。User允许检索和创建orders.
在ModelViewSet处理Order检索和创建操作的a 中,我正在针对请求用户过滤查询集:
.filter(company=self.request.user.company)
通过这种方式,我可以将company字段留在Serializer课堂之外Order:
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = ('some_other_field', ...)
当用户需要order使用POST请求创建时出现问题:company字段不能为空,但我也不想将此字段添加到序列化程序,因为User它始终分配给公司,因此我可以在内部通过检查发送此请求的用户来添加此字段.
到目前为止,我想出了非常残酷的解决方案来覆盖整个create方法CreateModelMixin并在序列化程序验证后手动分配字段:
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
Reservation.objects.create(
company=self.request.user.company,
some_other_field=request.data['some_other_field']
)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
慕尼黑8549860
临摹微笑
相关分类