Функция SerializerMethodField get_fieldname не вызывается
У меня есть этот Serializer
class RemovePermissionsSerializer(serializers.ModelSerializer):
user_permissions = serializers.SerializerMethodField()
def get_user_permissions(self, instance):
print(1)
**logic**
return data
class Meta:
model = User
fields = [
"user_permissions"
]
и общий набор представлений с этим действием
@action(
methods=["patch", "put"],
detail=True,
url_name="add-permissions",
url_path="add-permissions"
)
def add_permissions_request(self, request, pk):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = self.get_object()
user_permissions = serializer.validated_data.get("user_permissions")
response = User.add_permissions(user, user_permissions)
return Response(response, status=status.HTTP_200_OK)
функция get_user_permissions не вызывается, что бы я в нее не вставил, даже print() ничего не показывает, помогите пожалуйста?
Здесь вы используете сериализатор по-другому. Сериализатор SerializerMethodField
- это только для чтения: поскольку функция всегда является вводом для вывода. Здесь вы пытаетесь работать с ним в направлении записи.
Это одна из многих причин, почему использование SerializerMethodField
часто не является хорошей идеей.
Usually it makes more sense to work with a sub-serializer, a PrimaryKeyRelatedField
[drf-doc], or a SlugRelatedField
[drf-doc].
Вы можете, например, использовать:
from django.contrib.auth.models import Permission
class PermissionSerializer(serializers.ModelSerializer):
class Meta:
model = Permission
fields = ['__all__']
class RemovePermissionsSerializer(serializers.ModelSerializer):
user_permissions = PermissionSerializer(source='permission', many=True)
class Meta:
model = User
fields = ['user_permissions']
тогда вы указываете все детали разрешения, или вы можете работать с PrimaryKeyRelatedField
или SlugRelatedField
, чтобы позволить пользователю указать первичный ключ разрешения, или какое-то другое поле ("slug"):
from django.contrib.auth.models import Permission
class RemovePermissionsSerializer(serializers.ModelSerializer):
user_permissions = serializers.PrimaryKeyRelatedField(
source='permission', many=True, queryset=Permission.objects.all()
)
class Meta:
model = User
fields = ['user_permissions']