簡體   English   中英

Django Rest 框架完整性錯誤在 NOT NULL 約束失敗

[英]Django Rest Framework Integrity Error at NOT NULL constraint fail

我正在嘗試通過 django rest 框架發布交易,但是它在 django 日志中顯示錯誤,如下所示:

IntegrityError at /api/item_trans/ NOT NULL 約束失敗:chemstore_itemtransaction.bin_code_id

如果我從 Django 管理員 web 發布相同的數據,那沒有問題。 因此我認為問題發生在 DRF

歡迎任何幫助,謝謝

模型.py

class BinLocation(models.Model):
    bin_code = models.CharField(max_length=10, unique=True)
    desc = models.CharField(max_length=50)

    def __str__(self):
        return self.bin_code

    class Meta:
        indexes = [models.Index(fields=['bin_code'])]


class ItemMaster(models.Model):
    item_code = models.CharField(max_length=20, unique=True)
    desc = models.CharField(max_length=50)
    long_desc = models.CharField(max_length=150, blank=True)
    helper_qty = models.DecimalField(max_digits=10, decimal_places=4)
    unit = models.CharField(max_length=10, blank=False)

    def __str__(self):
        return self.item_code

    class Meta:
        verbose_name = "Item"
        verbose_name_plural = "Items"
        indexes = [models.Index(fields=['item_code'])]


class ItemTransaction(models.Model):
    # trace_code YYMMDDXXXX where XXXX is random generated
    trace_code = models.CharField(max_length=20, unique=False)
    item_code = models.ForeignKey(
        ItemMaster, on_delete=models.CASCADE, related_name='+', blank=False, null=False)
    datetime = models.DateTimeField(auto_now=False, auto_now_add=False)
    qty = models.DecimalField(max_digits=10, decimal_places=4)
    unit = models.CharField(max_length=10, blank=False)
    action = models.CharField(
        max_length=1, choices=ACTION, blank=False, null=False)
    bin_code = models.ForeignKey(
        BinLocation, related_name='+', on_delete=models.CASCADE, blank=False, null=False)
    remarks = models.TextField(blank=True)

    def __str__(self):
        return f"{self.trace_code} {self.datetime} {self.item_code} {dict(ACTION)[self.action]} {self.qty} {self.unit} {self.bin_code}"

序列化程序.py

class ItemMasterSerializer(serializers.ModelSerializer):
    class Meta:
        model = ItemMaster
        fields = '__all__'


class ItemTransactionSerializer(serializers.ModelSerializer):
    item_code = serializers.SlugRelatedField(
        slug_field='item_code',
        read_only=True
    )

    bin_code = serializers.SlugRelatedField(
        slug_field='bin_code',
        read_only=True,
        allow_null=False
    )

    class Meta:
        model = ItemTransaction
        fields = '__all__'

您可能需要使用 2 個字段,一個用於讀取數據,另一個用於創建和更新您的數據及其源數據。 在你的情況下,你可以試試這個:

class ItemTransactionSerializer(serializers.ModelSerializer):
    item_code_id = ItemMasterSerializer(read_only=True)
    item_code = serializers.PrimaryKeyRelatedField(
            queryset=ItemMaster.objects.all(),
            write_only=True,
            source='item_code_id'
        )
    
    bin_code_id = BinLocationSerializer(read_only=True
    bin_code = serializers.PrimaryKeyRelatedField(
            queryset= BinLocation.objects.all(),
            write_only=True,
            source='bin_code_id'
        )

由於您的兩個 ForeignKeys 中都有null=False ,因此 DRF 需要相應的 ID。 您似乎收到錯誤 NOT NULL 約束,因為您沒有在 DRF 中傳遞 ID。 所以你需要修復 bin_code_id 和 item_code_id 的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM