ManyToManyField фильтруется исключается при прохождении через представление DRF и сериализатор - PullRequest
0 голосов
/ 13 октября 2018

При попытке сохранить новую запись в базе данных посредством POSTing через маршрут Django Rest Framework мой ManyToManyField с именем shared_users на объекте отфильтровывается.Это странно, поскольку новый объект все еще создается, однако атрибут shared_users отображается в виде пустого списка.

Когда я проверяю с помощью отладчика Python, все изначально доступно для объекта запроса.

(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[]', []) (не уверен, почему имя поля появляется с [] в имени), я получаю результат u'1' (уже пропущено два идентификатора пользователя).

И когда я вычисляю serializer.data, он возвращает все с ожидаемыми значениями, кроме поля shared_users, как показано ниже.

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

Я предоставил мои файлы представлений и сериализаторов для справки.


views.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)

serializers.py

class MyCreateAndUpdateSerializer(serializers.ModelSerializer):
    shared_users = serializers.PrimaryKeyRelatedField(many=True, queryset=User.objects.all(), read_only=False)

    class Meta:
        model = Project
        fields = [
          'pk',
          'user',
          'data',
          'model_name',
          'description',
          'created_at',
          'date_modified',
          'shared_users',
          'last_modified_by'
        ]

1 Ответ

0 голосов
/ 14 октября 2018

Спасибо @dirkgroten за ответ на этот вопрос.

Оказывается, проблема была 'shared_users': request.data.get('shared_users', []) в диктофоне request_data в views.py.Поскольку значение, связанное с 'shared_users[]', является списком, я должен был использовать getlist для доступа к списку, например, request.data.getlist('shared_users[]', []).

См. Django QueryDict Docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...