При попытке сохранить новую запись в базе данных посредством 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'
]