Как сделать поля необязательными? DRF

Я использую django-rest-framework и хочу, чтобы поля "роль" и "функция" были необязательными при создании утверждения.

Пожалуйста, скажите, как я могу это сделать?

Я попробовал несколько трюков, например:

Я пытался:

function = FunctionsCreateSerializer(write_only=True, allow_null=True)

и

class Meta:
    ...

    optional_fields = [...]

но я получил

"function": [
        "This field is required."
    ]

когда я пытаюсь:

function = FunctionsCreateSerializer(write_only=True, required=False)

Я получаю:

KeyError at /api/user/ 'function''

Я действительно не понимаю, как я могу изменить мои сериализаторы

models.py

class Operator(models.Model):
    ...
    role = models.ForeignKey("OperatorRole", related_name="operator", on_delete=models.CASCADE, null=True, blank=True)


class OperatorRole(models.Model):
    function = models.ManyToManyField("FunctionRole", null=True)
    role = models.TextField(
        max_length=2,
        choices=Role.choices,
        default=Role.THERMIST
    )


class FunctionRole(models.Model):
    function = models.TextField(
        max_length=4,
        choices=Function.choices,
        default=Function.TPST,
        blank=True,
        null=True,
    )

serizlizers.py

class UserSerializer(serializers.ModelSerializer):
    ...
    role = RoleSerializer()
    function = FunctionsCreateSerializer(write_only=True)

     class Meta:
        model = models.Operator
        fields = ["id", "username", "password", "email", "is_active", "fio", "position", "phone", "role", "function",
                  "created", "updated"]


class FunctionsSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        return instance.function

    class Meta:
        model = models.FunctionRole
        fields = ("function",)


class FunctionsCreateSerializer(serializers.ModelSerializer):
    function = serializers.MultipleChoiceField(choices=models.Function)


    class Meta:
        model = models.FunctionRole
        fields = ("function",)
        validators = []


class RoleSerializer(serializers.ModelSerializer):
    functions = FunctionsSerializer(many=True, read_only=True, source='function', required=False)

    class Meta:
        model = models.OperatorRole
        fields = ("role", "functions",)

views.py

class UserList(generics.ListCreateAPIView):
    queryset = models.Operator.objects.all()
    serializer_class = serializers.UserSerializer
    permission_classes = ADMIN_PERMISSIONS
    filter_backends = DEFAULT_FILTERS
    filter_class = UserFilter
    search_fields = ["user__username", "user__email", "fio", "position",
                     "phone", "role__role", "role__function__function"]

    def create(self, request, *args, **kwargs):
        serializer = serializers.UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

Проблема в том, что : Вы используете UserSerializer в представлении UserList. Но в этом сериализаторе у вас есть эта строка : function = FunctionsCreateSerializer(write_only=True). Как вы догадываетесь, она требуется по умолчанию. Если вы хотите сделать поле function необязательным, то :

  1. function = FunctionsCreateSerializer(write_only=True, required=False)

  2. удалите строку function = FunctionsCreateSerializer(write_only=True) из UserSerializer и удалите поле function из полей Мета.

Вернуться на верх