django.db.utils.DataError:(1406,“第 1 行的“条形码”列的数据太长”)

Posted

技术标签:

【中文标题】django.db.utils.DataError:(1406,“第 1 行的“条形码”列的数据太长”)【英文标题】:django.db.utils.DataError: (1406, "Data too long for column 'barcodes' at row 1") 【发布时间】:2020-08-10 05:09:58 【问题描述】:

我正在尝试制作一个使用条形码扫描仪获取条形码值并将条形码值保存在数据库中的程序,当我尝试添加超过 5-6 个条形码时会出现问题。 它给了我“django.db.utils.DataError: (1406, "Data too long for column 'barcodes' at row 1")”错误。 我已经确定它是一个 model.textfield() 但这并不能解决我的问题。 我的模型如下所示:

    id = models.IntegerField(primary_key=True)
    barcodes = models.CharField(max_length=255)
    to_warehouse = models.CharField(max_length=255)
    from_warehouse = models.CharField(max_length=255)
    total_count = models.IntegerField()
    approval_flag = models.IntegerField(default=0)
    current_status = models.CharField(max_length=50, blank=True, null=True)
    error_message = models.CharField(max_length=255, blank=True, null=True)
    created_by = models.CharField(max_length=50, blank=True, null=True)
    created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True)


    class Meta:
        managed = False
        db_table = 'transfer_inventory'

    def __str__(self):
        return "%s" % self.id

为此创建 obj 的视图函数如下所示:

    def change_status(self, barcodes, warehouse_id, request, is_error="", msg=""):
        barcode_count = barcodes.count(',')
        _list_barcodes = barcodes.split(",")
        print("list: ", list)
        list_barcodes = []
        to_warehouse = Warehouse.objects.filter(id=warehouse_id).values_list('key', flat=True)[0]
        try:
            current_warehouse = UserWarehouseMapping.objects.filter(
                user=request.user).values_list('warehouse__key', flat=True).first()
        except:
            current_warehouse = "-"

        for i in _list_barcodes:
            list_barcodes.append(i)

        list_barcodes = list_barcodes.pop(len(list_barcodes) - 1)
        available_barcodes = list(
            Inventory.objects.filter(inventory_status='available').values_list('barcode', flat=True))

        InventoryTransfer.objects.create(barcodes=barcodes, to_warehouse=to_warehouse,
                                         total_count=barcode_count,
                                         created_by=request.user.username,
                                         from_warehouse=current_warehouse, current_status="Pending")


这部分具体是用于创建obj的:

InventoryTransfer.objects.create(barcodes=barcodes, to_warehouse=to_warehouse,
                                         total_count=barcode_count,
                                         created_by=request.user.username,
                                         from_warehouse=current_warehouse, current_status="Pending")

我一直被这个错误困扰很久,我不知道该怎么办。任何一种方法都将受到赞赏。谢谢。

【问题讨论】:

【参考方案1】:

根据您的模型,您的列条形码是 charfield 长度 255

barcodes = models.CharField(max_length=255)

您不能存储超过 255 个字符,因为这是您设置为 max_length 的值,如果您存储更长的文本以将其更改为

barcodes = models.TextField()

之后别忘了迁移


其他可能更合理的想法是为 Barcode 提供相关表

当您通过代码中的条形码进行过滤时,效率更高

【讨论】:

以上是关于django.db.utils.DataError:(1406,“第 1 行的“条形码”列的数据太长”)的主要内容,如果未能解决你的问题,请参考以下文章