为了账号安全,请及时绑定邮箱和手机立即绑定

在 DRF 请求中间接分配外键

在 DRF 请求中间接分配外键

白板的微信 2021-11-16 14:37:29
我需要分配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)
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

把这个加在你身上 CreateAPIView


这可用于覆盖 serializer.save() 方法并在保存之前添加额外的参数。


 def perform_create(self, serializer):

    # Do any operatons, and get all the data you need

    serializer.save(    param1 = data1,

                        param2  = data2,

                    )

在你的情况下:


def perform_create(self, serializer):

    company=self.request.user.company

    serializer.save(company = company)


查看完整回答
反对 回复 2021-11-16
?
临摹微笑

TA贡献1982条经验 获得超2个赞

您可以使用

serializer.save(company=company)

在视图集中,您可以在方法中进行自定义,perform_create例如

serializer.save(company=self.request.user.company)


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信