请帮我解读" ValueError:int()"的无效文字的追溯。在我的模特中

时间:2015-06-16 07:38:14

标签: django django-models django-middleware

我正在尝试创建ProductPart个对象列表,其中ProductPart.partVariety.variety_name实例的值匹配。这是我的问题的演示。

> v = Variety.objects.get(id=2)
> p = ProductPart.objects.get(id=1)
> v.variety_name
'Non Pareil (Inshell)'
> p.part
<Variety: Non Pareil (Inshell)>
> a = ProductPart.objects.values().filter(part=v.variety_name)
...
ValueError: invalid literal for int() with base 10: 'Non Pareil (Inshell)'

这种模式似乎在我的模型中的其他地方起作用,但由于某种原因它不在这里工作。有谁知道我做错了什么?有人可以帮我理解为什么它会到达一个int()对象吗?

回溯:

Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\Projects\AlmondKing\AlmondKing\InventoryLogs\models.py", line 49, in _total_sales_of_variety
  sold = ProductPart.objects.values().filter(part=self.variety_name)
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\query.py", line 679, in filter
  return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\query.py", line 697, in _filter_or_exclude
  clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\sql\query.py", line 1304, in add_q
  clause, require_inner = self._add_q(where_part, self.used_aliases)
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\sql\query.py", line 1332, in _add_q
  allow_joins=allow_joins, split_subq=split_subq,
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\sql\query.py", line 1194, in build_filter
  lookups, value)
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\fields\related.py", line 1740, in get_lookup_constraint
   ookup_class(target.get_col(alias, source), val), AND)
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\lookups.py", line 96, in __init__
  self.rhs = self.get_prep_lookup()
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\lookups.py", line 134, in get_prep_lookup
  return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs)
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\fields\__init__.py", line 727, in get_prep_lookup
  return self.get_prep_value(value)
File "C:\Users\Adam\Envs\AlmondKing\lib\site-packages\django\db\models\fields\__init__.py", line 985, in get_prep_value
  return int(value)
ValueError: invalid literal for int() with base 10: 'Non Pareil (Inshell)'

型号:

class Variety(models.Model):
    product_group = models.ForeignKey(ProductGroup)
    variety_name = models.CharField(max_length=140)
    husked = models.BooleanField()
    finished = models.BooleanField() #defunct
    description = models.CharField(max_length=500, blank=True)

class ProductPart(models.Model):
    product = models.ForeignKey(Product)
    part = models.ForeignKey(Variety)
    qty = models.DecimalField(max_digits=28, decimal_places=2)

4 个答案:

答案 0 :(得分:2)

您正在尝试将外键与字符串匹配,您需要提供模型

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>

注意:ProductPart.objects.values().filter(part=v) 也不是必需的

values

来自Values

的文档
  

一个QuerySet子类,当用作可迭代的而不是模型实例对象时返回字典。

换句话说,您使用当前的方法失去了对对象的控制权

答案 1 :(得分:2)

根据Django ORM,您应该直接在过滤器中处理模型对象(它使代码易于阅读)

v = Variety.objects.get(id=2)
a = ProductPart.objects.filter(part=v)

答案 2 :(得分:2)

当您尝试将字符串解析为int并且不是有效整数时,这是一个错误:int('hello')

您正试图在此查询中做一些奇怪的事情:

a = ProductPart.objects.values().filter(part=v.variety_name)

基本上,partVariety的外键(在这种情况下是一个外键是一个整数),你试图将它与字符串v.variety_name进行比较。

我认为正确的做法是这样的:

a = ProductPart.objects.filter(part=v)

答案 3 :(得分:2)

您应该使用:

Cannot read property 'list' of undefined

检查这个Django Doc Lookups that span relationships