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

时间:2017-10-26 19:36:58

标签: python django django-rest-framework

我们说我有A型和B型。

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

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

我的模型ViewSet如下所示:

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

在Serializer create method

中实现逻辑
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)

答案 1 :(得分:0)

这可能不是最优雅的方法......但这就是我的方法:

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副手动定义一个ModelViewset。希望有人有更好的方法。