繁体   English   中英

在使用Django Rest Framework进行对象创建调用期间,如何创建与外键相关的对象?

[英]How to create foreign key related objects during object create call with the Django Rest Framework?

假设我有模型A和模型B。

模型A具有一系列字段,其中包括创建对象A的用户填写的用户字段。

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

我的模型A ViewSet看起来像这样:

class OrganizationViewSet(DynamicModelViewSet):
    queryset = Organization.objects.all()
    serializer_class = OrganizationSerializer
    permission_classes = (IsAdminOfPermission,)

因此,在创建组织时,我想使用创建组织的用户以及可能使用组织对象本身来创建一堆对象B。

我该怎么做呢?

在Serializer创建方法中实现逻辑

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)

这可能不是最优雅的方法...但是,我将按照以下方式进行操作:

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

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

换句话说,我将使用API​​View手动定义ModelViewset。 希望有人有更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM