如何告诉我的序列化程序字段为空是可以的?



使用Django 2.0、Python 3.7和Django电话号码字段(v4.0.0(模块。我有一个型号,上面有我的电话号码字段,我不想被要求。。。

from phonenumber_field.modelfields import PhoneNumberField
...
class Coop(models.Model):
name = models.CharField(max_length=250, null=False)
type = models.ForeignKey(CoopType, on_delete=None)
address = AddressField(on_delete=models.CASCADE)
enabled = models.BooleanField(default=True, null=False)
phone = PhoneNumberField(null=True)
email = models.EmailField(null=True)
web_site = models.TextField()

我创建了这个web/maps/views.py文件来处理POST请求。。。

class CoopDetail(APIView):
"""
Retrieve, update or delete a coop instance.
"""
def get_object(self, pk):
try:
return Coop.objects.get(pk=pk)
except Coop.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
coop = self.get_object(pk)
serializer = CoopSerializer(coop)
return Response(serializer.data)
def put(self, request, pk, format=None):
coop = self.get_object(pk)
serializer = CoopSerializer(coop, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

然后我有了这个web/maps/serializers.py调用。。。

class CoopSerializer(serializers.ModelSerializer):
type = CoopTypeField()
address = AddressTypeField()
class Meta:
model = Coop
fields = ['id', 'name', 'type', 'address', 'enabled', 'phone', 'email', 'web_site']
def to_representation(self, instance):
rep = super().to_representation(instance)
rep['type'] = CoopTypeSerializer(instance.type).data
rep['address'] = AddressSerializer(instance.address).data
return rep
def create(self, validated_data):
"""
Create and return a new `Snippet` instance, given the validated data.
"""
return Coop.objects.create(**validated_data)
def update(self, instance, validated_data):
"""
Update and return an existing `Coop` instance, given the validated data.
"""
instance.name = validated_data.get('name', instance.name)
instance.type = validated_data.get('type', instance.type)
instance.address = validated_data.get('address', instance.address)
instance.enabled = validated_data.get('enabled', instance.enabled)
instance.phone = validated_data.get('phone', instance.phone)
instance.email = validated_data.get('email', instance.email)
instance.web_site = validated_data.get('web_site', instance.web_site)
instance.save()
return instance

但是,尽管我已经指定我不想要一个必需的电话号码字段,但当我向端点提交curl请求时,我收到了一个抱怨电话号码不能为空的错误。当我提交此JSON 时

{
"name": "1999",
"type": {
"name": "Coworking Space"
},
"address": {
"street_number": "222",
"route": "1212",
"raw": "222 W. Merchandise Mart Plaza, Suite 1212",
"formatted": "222 W. Merchandise Mart Plaza, Suite 1212",
"latitude": 41.88802611,
"longitude": -87.63612199,
"locality": {
"name": "Chicago",
"postal_code": "60654",
"state": 1
}
},
"enabled": true,
"phone": "",
"email": null,
"web_site": "http://www.1871.com/"
}

我收到这个错误。。。

{"phone":["This field may not be blank."]}

extra_kwargs呢?

class CoopSerializer(serializers.ModelSerializer):
class Meta:
model = Coop
fields = ['id', 'name', 'type', 'address', 'enabled', 'phone', 'email', 'web_site']
extra_kwargs = {
'phone': {
'required': False, 
'allow_blank': True
}
}

您可以将kwargs添加到模型序列化程序字段中,如下所示:

class CoopSerializer(serializers.ModelSerializer):
phone = serializers.CharField(
required=False, # the phone key can be omitted from the request
allow_blank=True, # the value can be an empty string
allow_null=False # the value can be null/None
)

在您的模型中,如果您希望在用户提交表单时电话为空,请在电话字段中添加blank=True。

phone = PhoneNumberField(null=True, blank=True)

然后,应用makemigrations和migration来测试您的代码。如果在模型的字段中定义了blank=True,则不需要在序列化程序中指定此项。

null=True表示此字段在数据库级别中可以为null。blank=True表示此字段在表单中可以为空。有关详细信息,请查看此答案。

相关内容

最新更新