Python 如何使用Django Rest框架在对象创建调用期间创建外键相关对象?

Python 如何使用Django Rest框架在对象创建调用期间创建外键相关对象?,python,django,django-rest-framework,Python,Django,Django Rest Framework,假设我有A型和B型 模型A有一系列字段,包括用户字段,该字段由创建对象A的用户填写 当创建对象A时,我想使用创建对象A的用户创建一组对象B,并可能使用对象A本身作为外键 我的模型A视图集如下所示: class OrganizationViewSet(DynamicModelViewSet): queryset = Organization.objects.all() serializer_class = OrganizationSerializer permission_

假设我有A型和B型

模型A有一系列字段,包括用户字段,该字段由创建对象A的用户填写

当创建对象A时,我想使用创建对象A的用户创建一组对象B,并可能使用对象A本身作为外键

我的模型A视图集如下所示:

class OrganizationViewSet(DynamicModelViewSet):
    queryset = Organization.objects.all()
    serializer_class = OrganizationSerializer
    permission_classes = (IsAdminOfPermission,)
因此,当创建一个组织时,我想使用创建该组织的用户创建一组对象B,并可能使用该组织对象本身


我该怎么做?

这可能不是最优雅的方法。。。但我会这样做:

class DemoHandler(APIView):
    authentication_classes = (CsrfExemptSessionAuthentication,)
    permission_classes = (IsAuthenticated,)

    def post(self, request, format=None):
       m = ModelA(..., user=request.user, ...)
       m.save()
       m2 = ModelB( ... )
       ...

换句话说,我只需要使用APIView vice手动定义ModelViewset。希望有人有更好的方法。

在序列化器创建方法中实现逻辑

class OrganizationSerializer(serializers.ModelSerializer):
    # ...
    # ...
    # ...
    def create(self, validated_data):
        user = validated_data.get('user')
        organization = Organization.objects.create(**validated_data)
        # create model B with `user` and `organization`
        # like ModelB.objects.create(user=user, organization=organization, ...)
        return organization
要将用户从视图传递到序列化程序,必须通过序列化程序的save方法发送

比如说

class OrganizationList(APIView):
    queryset = Organization.objects.all()
    serializer_class = OrganizationSerializer
    permission_classes = (IsAdminOfPermission,)

    def post(self, request, format=None):
       serializer = OrganizationSerializer(data=request.data)
       serializer.is_valid(raise_exception=True)
       serializer.save(user=request.user)
       return Response(serializer.data, status=status.HTTP_201_CREATED)

另外,使用
bulk\u create
一次保存所有ModelB实例。这是您必须采用的方法,因为要添加某些内容作为foreignKey关系,它必须已经保存到DB中。