通过DRF视图和序列化器传递时,ManyToManyField被过滤排除

时间:2018-10-13 06:40:59

标签: python django python-2.7 django-rest-framework

当尝试通过Django Rest Framework路由通过POST将新记录持久保存到数据库时,我在对象上名为ManyToManyField的{​​{1}}被滤出了。很奇怪,因为仍然创建了新对象,但是shared_users属性显示为空列表。

当我通过Python Debugger检查时,所有内容最初都可以在请求对象上找到。

shared_users

但是,当我检查带有(Pdb) request.data <QueryDict: {u'shared_users[]': [u'4', u'5', u'1'], u'model_name': [u'A name'], u'description': [u'A description']}> 的字段时(不确定字段名为何在名称中带有request.data.get('shared_users[]', [])的情况下),我得到的结果是[](已经缺少两个用户ID)。

当我评估u'1'时,它将返回除serializer.data字段外的所有具有期望值的值,如下所示。

shared_users

我已经提供了我的视图和序列化器文件以供参考。


views.py

{'last_modified_by': 3, 'description': u'A description', 'user': 3, 'shared_users': [], 'model_name': u'A name'}

serializers.py

class MyCreateView(generics.GenericAPIView):
    pass
    serializer_class = MyCreateAndUpdateSerializer

    def get_queryset(self):
        return User.objects.filter(pk=self.kwargs.get('user'))

    def post(self, request, format=None, **kwargs):
        # This dictionary is used to ensure that the last_modified_by field is always updated on post to be the current user
        request_data = {
            'user': request.user.id,
            'model_name': request.data['model_name'],
            'description': request.data['description'],
            'last_modified_by': request.user.id,
            'shared_users': request.data.get('shared_users', [])
         }

    serializer = MyCreateAndUpdateSerializer(data=request_data)

    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

1 个答案:

答案 0 :(得分:0)

感谢@dirkgroten给出答案。

原来问题是'shared_users': request.data.get('shared_users', [])中request_data字典上的views.py。由于与'shared_users[]'关联的值是一个列表,因此我应该一直使用getlist来访问列表,例如request.data.getlist('shared_users[]', [])

请参见google support