"截断不正确的DOUBLE值:X_XX"

时间:2018-01-19 15:46:53

标签: python mysql django django-models mariadb

Django的ORM并没有点击给我,但我打算周末阅读documentation,以便点击它。

与此同时,我有一个问题我需要解决,而我无法解决这个问题。

我第一次来到这里,并通过提供的答案得到解决:

ValueError: invalid literal for int() with base 10 seems to be related to ForeignKey

我已将查询修改为:

# data['product_id] = 78
# returns A_17
product_code = Products.objects.get(id=data['product_id']).code

# this is where the error occurs
print(ProductPositions.objects.filter(product_code__code=product_code))
  

/mnt/c/dev/current/client/.venv/client/lib/python3.6/site-packages/pymysql/cursors.py:166:警告:(1292,"截断错误的DOUBLE值:' A_15'")

     

result = self._query(查询)   

我甚至不确定为什么它会查看A_15,因为它只应在A_17上过滤,因此这是一个我不明白的问题

解释这些表格是因为我不认为它非常直观。 Products看起来像这样(与删除的列无关):

-- Products table
id     code
--------------
77     A_16
78     A_17
81     M_15

code中有多个ProductPositionscode更像是一系列产品而且product_no(我还没有达到并且是下一步)是该系列中的产品。最终,我试图获得描述,但仅限于当前过滤A_17。所以它看起来像:

-- ProductPositions table
product_code         product_no       description
-------------------------------------------------
A_17                 ABC123           Widget 1
A_17                 DEF456           Widget 2
A_17                 GHI789           Widget 3
A_16                 ABC123           Widget 1
A_16                 DEF456           Widget 2
A_16                 GHI789           Widget 3

这些是每个模型:

class Products(models.Model):
    id = models.AutoField(primary_key=True)
    code = models.CharField(unique=True, max_length=16)
    name = models.CharField(max_length=255, blank=True, null=True)
    short_name = models.CharField(max_length=128)

class ProductPositions(models.Model):
    product_code = models.ForeignKey(Products, db_column='product_code', null=False)
    product_no = models.DecimalField(unique=True, max_digits=12, decimal_places=1, primary_key=True)
    product_title = models.CharField(max_length=255)
    product_description = models.TextField()

    def __str__(self):
        return self.product_description

    class Meta:
        db_table = 'Product_Positions'
        unique_together = ('product_code', 'product_no')

此外,它似乎可能是数据库生成的错误。但是,当我在./manage.py shell中执行以下操作以查看原始SQL查询列表时,不会出现任何内容(只有一个连接且未命名):

>>> from django.db import connection
>>> connection.queries
[]

无论如何,最终试图前往ProductPositions.objects.filter(product_code__code=product_code).filter(product_no=data['product_no'].description,但在每一步都遇到问题。

要明确问题:字符串正在传递到varchar字段,但错误将以double返回。为什么?

2 个答案:

答案 0 :(得分:0)

您的查询最后包含拼写错误

object = ProductPositions.objects.filter(product_code__code=product_code,
                                product_no=data['product_no'])
print(object.product_description)

警告:(1292,"截断不正确的DOUBLE值:' A_15'")是因为您在查询中比较两种不兼容的数据类型我想。

假设A_15存储在表的第一行中,则引发错误。确保根据字段限制(包括小数值)传递数据[' product_no'] 的值。

请告诉我这是否有帮助。

PS:将此作为答案发布,因为我没有足够的评论意见。

编辑:

假设您传递的是 product_code product_no 的正确值,您可以获得正确的实例

obj = get_object_or_404(ProductPositions,
                        product_code__code=product_code,
                        product_no=data['product_no'])
print(obj.product_description)

这对我有用。 enter image description here

答案 1 :(得分:0)

好的,终于弄清楚在进行详细调试之后问题是什么,以便我实际上可以看到正在发送的查询。问题在于它是如何加入的,默认情况下它使用pk Products

ProductPositions.objects.filter(product_code__code=product_c‌​ode)

基本上被翻译成:

... INNER JOIN.... ON 'ProductPositions'.'product_code' = 'Products'.'id'

我真的不想要。应该是:

... INNER JOIN.... ON 'ProductPositions'.'product_code' = 'Products'.'code'

因此解决方案是通过添加product_code来修复ProductPositions模型中的to_field字段。正如文档所说:

  

对于像映射到模型实例的ForeignKey这样的字段,默认值应该是它们引用的字段的值(除非设置了to_field,否则为pk)而不是模型实例。

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.to_field

product_code = models.ForeignKey(Products, to_field='code', db_column='product_code', null=False)

现在数据正在按预期检索并且没有错误。