Как мне сказать моему сериализатору, что поле может быть пустым? - PullRequest
1 голос
/ 04 марта 2020

Использование Django 2.0, Python 3.7 и модуля django -phonenumber-field (v 4.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

Но несмотря на то, что я указал, я не хочу требуемый телефон В поле номера я получаю сообщение об ошибке, сообщающее, что номера телефонов не могут быть пустыми, когда я отправляю запрос скручивания конечной точке. Когда я отправляю это 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."]}

Ответы [ 3 ]

1 голос
/ 06 марта 2020

В вашей модели добавьте пустое = True в поле телефона, если вы хотите, чтобы телефон оставался пустым, когда пользователь отправляет форму.

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

Затем примените makemigrations и мигрируйте, чтобы проверить свой код. Вам не нужно указывать это в сериализаторе, если вы определили blank = True в поле модели.

null = True означает, что это поле может быть пустым на уровне базы данных. blank = True означает, что это поле может быть пустым в форме. Проверьте этот ответ для более подробной информации.

0 голосов
/ 05 марта 2020

Вы можете добавить 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
    )

0 голосов
/ 04 марта 2020

А как насчет 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
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...