如何使字段可选? DRF
how to make fields optional? 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)
问题是: 您正在 UserList
视图中使用 UserSerializer
。但是在那个序列化器中,你有这一行:function = FunctionsCreateSerializer(write_only=True)
。如您所料,默认情况下需要它。如果你想让 function
字段可选,那么:
function = FunctionsCreateSerializer(write_only=True, required=False)
从 UserSerializer
中删除行 function = FunctionsCreateSerializer(write_only=True)
并从 Meta 字段中删除字段 function
。
我使用 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)
问题是: 您正在 UserList
视图中使用 UserSerializer
。但是在那个序列化器中,你有这一行:function = FunctionsCreateSerializer(write_only=True)
。如您所料,默认情况下需要它。如果你想让 function
字段可选,那么:
function = FunctionsCreateSerializer(write_only=True, required=False)
从
UserSerializer
中删除行function = FunctionsCreateSerializer(write_only=True)
并从 Meta 字段中删除字段function
。