Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在DRF请求中间接分配外键_Python_Django_Serialization_Django Rest Framework - Fatal编程技术网

Python 在DRF请求中间接分配外键

Python 在DRF请求中间接分配外键,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我需要将ForeignKey分配给对象,而不需要将其放在序列化程序类中。以下是我的案例过于简化的版本: 我有叫做公司、用户和订单的型号: class Company(models.Model): ... class User(AbstractBaseUser) company = models.ForeignKey('Company', null=False) ... class Order(models.Model): company = models.Fo

我需要将
ForeignKey
分配给对象,而不需要将其放在
序列化程序
类中。以下是我的案例过于简化的版本:

我有叫做
公司
用户
订单
的型号:

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 = ...
    ...
class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ('some_other_field', ...)
这样可以有多个
公司
,每个
公司
可以有多个
用户
订单
<代码>用户可以检索和创建
订单

在处理
Order
检索和创建操作的
ModelViewSet
中,我根据请求用户筛选queryset:

.filter(company=self.request.user.company)
通过这种方式,我可以将
公司
字段从
序列化程序
类中保留下来,用于
订单

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 = ...
    ...
class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ('some_other_field', ...)
当用户需要使用
POST
请求创建
order
时会出现问题:
company
字段不能为空,但我也不想将此字段添加到序列化程序中,因为
user
始终分配给company,因此我可以通过检查发送此请求的用户在内部添加此字段

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

    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)
你可以用

serializer.save(company=company)
在视图集中,您可以通过以下方法进行自定义:
perform\u create

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

将此添加到您的
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)
您可以使用serializer.save(company=company)