我需要将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
中,我正在针对请求用户过滤查询集:
.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
答案 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)