AssertionError: Поле '' было объявлено на сериализаторе '', но не было включено в опцию 'fields'. необязательный - PullRequest
0 голосов
/ 14 февраля 2020

Я использую Django Rest Framework для создания APIRest, но я получил эту ошибку, когда пытался сделать простое предложение для ресурса со скидкой

Это моя модель

class Discount(BaseModel):
    """ Discount Model. """
    code = models.CharField(max_length=50)
    rate = models.DecimalField( max_digits=3, decimal_places=2)
    class DiscountStatus(models.TextChoices):
        ENABLED = 'ENABLED'
        DISABLED = 'DISABLED'
        REDEEMED = 'REDEEMED'
    status = models.CharField("status", choices=DiscountStatus.choices, default=DiscountStatus.ENABLED,  max_length=10)
    insurance_company = models.ForeignKey("sanitas.InsuranceCompany", on_delete=models.CASCADE)
    appointment = models.ForeignKey("sanitas.Appointment", verbose_name="appointment", on_delete=models.CASCADE, blank=True, null=True)
    class Meta():
        """ Meta class. """
        db_table = 'discounts'

Это мой сериализатор

class DiscountModelSerializer(serializers.ModelSerializer):
    """ Insurance company model serializer. """

    insurance_company = InsuranceCompanyModelSerializer(many=False, read_only=True, allow_null=True, required=False)
    insurance_company_id = serializers.IntegerField(allow_null=True, required=False,)

    appointment = AppointmentModelSerializer(many=False, read_only=True, allow_null=True, required=False)
    appointment_id = serializers.IntegerField(allow_null=True, required=False)

    class Meta():
        """ Meta class. """
        model = Discount
        fields = (
            'id',
            'code',
            'rate',
            'status',
            'appointment'
            'insurance_company'
            'insurance_company_id'
            'appointment_id'
        )

А это мой Viewset

class DiscountViewset(viewsets.ModelViewSet):
    """ Schedule items will be the time unit to manage appointments. """

    queryset = Discount.objects.all()
    serializer_class = DiscountModelSerializer

    @action(methods=['post'], detail=False)
    def generate(self, request):
        """ Create dicounts in bulk. """
        rate = 1 - request.data['rate'] / 100
        insurance_company = get_object_or_404(InsuranceCompany, pk=request.data['insurance_company_id'])
        count = 0
        amount = request.data['amount']
        response = []
        while count < amount:
            code = insurance_company.code + randomString(8)
            discount = Discount()
            discount.rate = rate
            discount.code = code
            discount.insurance_company = insurance_company      
            discount.save()
            serializer = DiscountModelSerializer(discount)
            response.append(serializer.data)
            count = count + 1
        return Response(response, status=status.HTTP_200_OK)

Я предполагаю, что ошибка появляется, потому что у меня есть необязательное поле (на самом деле не является обязательным, но когда я создаю Коды скидок еще не назначены, поэтому они будут добавлены позже), и появляется ошибка, потому что я не добавил поле «Назначение» и при попытке получить ресурсы, которые я делаю, Эта ошибка показывает

AssertionError at /discounts/generate/ The field 'appointment_id' was declared on serializer DiscountModelSerializer, but has not been included in the 'fields' option.
...