【问题标题】:"Truncated incorrect DOUBLE value: X_XX"“截断不正确的 DOUBLE 值:X_XX”
【发布时间】:2018-06-28 21:50:02
【问题描述】:

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 '")

结果 = self._query(查询)

我什至不确定它为什么要查看 A_15,因为它应该只过滤 A_17,所以这是我不明白的一个问题

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

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

ProductPositions 中有多个codecode 更像是一个产品线,而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。为什么?

【问题讨论】:

  • "A_17" 不是数字,它是一个字符串。你不能从中得到双倍。
  • 没错。 product_code = 'A_17' 和它被用作过滤参数的字段显然也是一个字符串,那么这个 DOUBLE 业务是关于什么的?

标签: python mysql django django-models mariadb


【解决方案1】:

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

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

警告:(1292, "Truncated wrong DOUBLE value: 'A_15'") 是因为您在查询中比较了两种不兼容的数据类型。

假设 A_15 存储在表的第一行中,它会引发错误。确保您根据字段限制传递 data['product_no'] 的值,即包括十进制值。

如果有帮助,请告诉我。

PS:将其发布为答案,因为我没有足够的评论点。

编辑:

假设您传递了正确的 product_codeproduct_no 值,您可以获得正确的实例

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

这对我有用。

【讨论】:

  • product_nodata['product_no'] 都是 DOUBLE。话虽这么说,导致错误的查询位是ProductPositions.objects.filter(product_code__code=product_code)
  • 查看更新后的答案,如果您仍然无法解决,我要求您发布完整的回溯和视图函数,用于传递值。
【解决方案2】:

好的,在打开详细调试之后终于弄清楚了问题所在,这样我就可以实际看到正在发送的查询。问题在于它是如何加入的,它默认使用Productspk

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'

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

对于映射到模型实例的 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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2023-03-28
    相关资源
    最近更新 更多