Django Почтальон ошибка, это поле обязательно для заполнения - PullRequest
0 голосов
/ 18 февраля 2020

Я получаю

{"franchise":["This field is required."]}

, когда отправляю запрос POST на localhost Django через

http://localhost:8000/api/franchise/charge/

Я отправляю следующие 2 поля в качестве тела почтальона

key: price       value: 1000
key: franchise   value: 1

URL

router.register(r'franchise/charge', views.FranchiseChargeViewSet)

Просмотр

class FranchiseChargeViewSet(viewsets.ModelViewSet):
    queryset = FranchiseCharge.objects.all()
    serializer_class = FranchiseChargeSerializer

    def get_permissions(self):
        permission_classes = []
        if self.action == 'create':
            permission_classes = [IsFranchise]
        elif self.action == 'retrieve':
            permission_classes = [IsFranchise]
        elif self.action == 'list':
            permission_classes = [IsFranchise]
        elif self.action == 'update' or self.action == 'partial_update':
            permission_classes = [IsFranchise]
        elif self.action == 'destroy':
            permission_classes = [IsFranchise]
        return [permission() for permission in permission_classes]

Модель

class FranchiseCharge(models.Model):
    franchise = models.ForeignKey(Franchise,null=True,on_delete=models.SET_NULL, default=1)
    time = models.DateTimeField(default=timezone.now)
    price = models.PositiveIntegerField(default=0)

Сериализатор

class FranchiseChargeSerializer(RelationModelSerializer):
    franchise = FranchiseSerializer(is_relation=True)
    class Meta:
        model = FranchiseCharge
        fields = ('id','franchise','time','price')

    @transaction.atomic
    def create(self, validated_data):
        instance = FranchiseCharge.objects.create(**validated_data)
        return instance

Что мне нужно сделать, чтобы это исправить?

1 Ответ

1 голос
/ 18 февраля 2020

Вы используете вложенный сериализатор , поэтому данные для него должны быть вложены json объект в данные.

Как я вижу, вы используете RelationModelSerializer - если он соответствует описанному в связанной статье - он также предлагает поместить имя поля pk связанной модели во вложенный json:

{
  "price": 1000,
  "franchise": {
    "id": 1
  }
}

Для обычных вложенных серилизаторов DRF - один из вариантов - использовать разные сериализаторы для чтения и записи. Таким образом, сериализатор для записи может быть сконфигурирован без вложенного сериализатора, просто примите franchise_id непосредственно в поле франшизы.

Проверьте этот SO-ответ на вложенных сериализаторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...