在DRF请求中间接分配外键

时间:2019-02-22 07:40:28

标签: python django serialization django-rest-framework

我需要将ForeignKey分配给对象,而不必将其放在Serializer类中。这是我的案例的过度简化版本:

我有称为CompanyUserOrder的模型:

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可以有多个usersorders。允许User检索和创建orders

在处理ModelViewSet检索和创建操作的Order中,我正在针对请求用户过滤查询集:

.filter(company=self.request.user.company)

这样,我可以将company类的Serializer字段留给Order

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ('some_other_field', ...)

当用户需要使用order请求创建POST时出现问题:company字段不能为空,但是我不想将此字段添加到序列化程序中,因为{{ 1}}始终分配给公司,因此我可以在内部通过检查哪个用户发送此请求来添加此字段。

到目前为止,我想出了一个非常残酷的解决方案,它覆盖了User中的整个create方法,并在序列化程序验证后手动分配了字段:

CreateModelMixin

2 个答案:

答案 0 :(得分:2)

您可以使用

serializer.save(company=company)

在视图集中,您可以使用类似方法perform_create自定义

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

答案 1 :(得分:1)

将此添加到您的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)