IntegrityError: нулевое значение в столбце invoiceOwner_id нарушает ограничение на ненулевое значение - PullRequest
0 голосов
/ 04 августа 2020

В моем приложении django у меня возникают трудности, когда я хочу добавить новый объект, который использует таблицу paymentInvoice .

Ошибка, которую я получаю из своего API выглядит так:

IntegrityError в / api / clients / invoice / null value в столбце invoiceOwner_id нарушает ограничение not-null. ДЕТАЛИ: Неудачная строка содержит (10, INV-0006, Lix, 2020-08-04, 1, Pending, 3000, null).

NB: Я не создал поле invoiceOwner_id, postgres автоматически добавил его или, скорее, использует его как представление для моего invoiceOwner поля

class Purchaser(models.Model):
    name = models.CharField(max_length=50)
    phone = models.CharField(max_length=20, unique=True)
    email = models.EmailField(max_length=255, unique=True, blank=True)
    image = models.ImageField(default='default.png', upload_to='customer_photos/%Y/%m/%d/')
    data_added = models.DateField(default=datetime.date.today)

    def __str__(self):
        return self.name


class paymentInvoice(models.Model):

    invoiceNo = models.CharField(max_length=50, unique=True, default=increment_invoice_number)
    invoiceOwner = models.ForeignKey(Purchaser, on_delete=models.CASCADE, related_name="invoice_detail")
    product = models.CharField(max_length=50, blank=True)
    date = models.DateField(default=datetime.date.today)
    quantity = models.PositiveSmallIntegerField(blank=True, default=1)
    payment_made = models.IntegerField(default=0)

    def __str__(self):
        return self.invoiceOwner.name

серилизаторов файла

class paymentInvoiceSerializer(serializers.ModelSerializer):
    invoiceOwner = serializers.SerializerMethodField()

    class Meta:
        model = paymentInvoice
        fields = '__all__'

    def get_invoiceOwner(self, instance):
        return instance.invoiceOwner.name

просмотров файла

class paymentInvoiceListCreateView(ListCreateAPIView):

    serializer_class = paymentInvoiceSerializer
    queryset = paymentInvoice.objects.all().order_by('-date')

GET результат вызова API.

{
    "id": 1,
    "invoiceOwner": "Martin",
    "invoiceNo": "INV-0001",
     "product": "",
    "date": "2020-08-04",
    "quantity": 1,
    "payment_made": 0
}

Пытался передать ниже как POST, но получил основную ошибку

{
    "invoiceOwner": "Becky",
    "product": "Lix",
    "quantity": 1,
    "payment_made": 3000
}

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Как я сказал в комментарии: вам необходимо явно переопределить метод create в вашем сериализаторе, поскольку ваша модель имеет внешний ключ invoiceOwner, просто чтобы сначала создать этот экземпляр как экземпляр Purchaser.

Вы можете попробовать код ниже:

class paymentInvoiceSerializer(serializers.ModelSerializer):
    invoiceOwner = serializers.SerializerMethodField()

    class Meta:
        model = paymentInvoice
        fields = '__all__'

    def get_invoiceOwner(self, instance):
        return instance.invoiceOwner.name

   <strong>def create(self, validated_data):
        purchaser_name = validated_data.get("invoiceOwner") 
        purchaser = Purchaser(name=purchaser_name,
            # you need to have phone, email, since these fields are unique,
            # they can't remain null
        )
        purchaser.save()
        return paymentInvoice.objects.create(invoiceOwner = purchaser, **validated_data)</strong>
0 голосов
/ 04 августа 2020

"invoiceOwner" в вашем serializers.py - это SerializerMethodField, который только для чтения , поэтому вы получаете сообщение об ошибке, вам нужно определить метод create самостоятельно

...