“截断了不正确的双精度值:x\u xx”

niwlg2el  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(382)

django的orm不适合我,但我打算用周末的时间阅读文档以使其符合我的要求。
与此同时,我有一个问题我需要解决,我一直未能解决。
我的第一个问题是在这里,答案是:
valueerror:基为10的int()的无效文本似乎与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,“截断的不正确的双精度值:'a_')
结果=自我查询(查询)
我甚至不知道它为什么在看 A_15 因为它应该只在 A_17 所以这是一个我不明白的问题
解释这些表格是因为我觉得这不是很直观。这个 Products 将如下所示(删除与此不相关的列):

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

有多个 codeProductPositions . code 更像是一系列的产品 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 . 为什么?

ct2axkht

ct2axkht1#

好的,在打开详细调试之后,我终于知道问题出在哪里了,这样我就可以看到发送的查询了。问题是它是如何加入的,它是如何使用 pkProducts 默认情况下。

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这样Map到模型示例的字段,默认值应该是它们引用的字段的值(pk,除非设置了to\ field),而不是模型示例。
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)

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

myss37ts

myss37ts2#

你的查询结尾有一个输入错误

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

警告:(1292,“截断的不正确的双精度值:'a_'”)是因为您正在比较查询中两个不兼容的数据类型。
假设表的第一行中存储了一个\u15,则会引发一个错误。确保您正在根据字段约束传递数据值['product\u no'],即包括十进制值。
如果这有帮助,请告诉我。
附言:因为我没有足够的观点发表评论,所以把这个作为一个答案。
编辑:
假设您为product\u code和product\u no传递了正确的值,那么您可以得到正确的示例

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

这对我有用。

相关问题