我们说我有A型和B型。
模型A包含一系列字段,包括用户字段,该字段由创建对象A的用户填写。
当创建对象A时,我想使用创建对象A的用户创建一堆对象B,并且可以使用对象A本身作为外键。
我的模型ViewSet如下所示:
class OrganizationViewSet(DynamicModelViewSet):
queryset = Organization.objects.all()
serializer_class = OrganizationSerializer
permission_classes = (IsAdminOfPermission,)
因此,当创建组织时,我想使用创建组织的用户创建一堆对象B,并可能使用组织对象本身。
我该怎么做?
答案 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。希望有人有更好的方法。