измените следующее
permissions = PermissionSerializer(many=True)
на
permissions = PermissionSerializer(read_only=True, many=True)
update
В цикле django-restframework-serializer последовательно выполняются определенные действия.Что касается вашего случая, я предположил, как пройти проверку валидации поля разрешений.всякий раз, когда вы объявляете другой сериализатор, который в PermissionSerializer
в этом поле, которое ожидает следующего, должен пройти проверку этого сериализатора, где требуются codename
и name
, и, конечно, не передавая их, вот почему вы получаете эту ошибку.Если мы присвоим это поле как read_only, следующая проверка будет проходить в обход.Я надеюсь, что вы получите разрешения для validated_data, если его там нет, вы можете получить от self.context['request']data.get('permissions')
в вашем переписанном методе create
.
Edit
UserGroupSerializer должен выглядеть следующим образом
class UserGroupSerializer(serializers. HyperlinkedModelSerializer):
permissions = PermissionSerializer(many=True, read_only=True)
class Meta:
model = Group
fields = (
'pk',
'name',
'permissions'
)
read_only_fields = ('pk',)
def create(self, validated_data):
"""
Overriding the default create method of the Model serializer.
"""
permission_data = self.context['request'].data.get('permissions')
group = Group.objects.create(**validated_data)
for permission in permission_data:
permissionNow = Permission.objects.get(name='view_profile')
group.permissions.add(permissionNow)
return group
А также в представлениях
def create(request):
if request.method == 'POST':
serializer = UserGroupSerializer(data = request.data, context={'request': request})
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)
Как передать контекстные данные в сериализатор, соответствующие показания ссылка