【问题标题】:invalid literal for int() with base 10: 'Ice Cream' error基数为 10 的 int() 的无效文字:“冰淇淋”错误
【发布时间】:2019-04-29 12:17:45
【问题描述】:

我正在尝试显示特定产品的库存记录。在将该产品的 id 传递给库存记录时,它显示 int() 的无效文字,基数为 10:“冰淇淋”错误。 我的代码如下所示: 模型.py

class mProduct(models.Model):


 mProduct_id=models.AutoField(primary_key=True)
 mProduct_name=models.CharField(max_length=50)
 mProduct_qtyunit = 
 models.ForeignKey(mProductUnit,on_delete=models.CASCADE) #Product 
                  ##Unit has one to many relationship with 
                        ##mProduct
 mProduct_qty=models.FloatField(default=0) ##current stock



 def __str__(self):
     return self.mProduct_name

class mStock(models.Model):
  mStock_id=models.AutoField(primary_key=True)
  mStock_date=models.DateTimeField(default=timezone.now)
  mStock_product=models.ForeignKey(mProduct,on_delete=models.CASCADE)
  mStock_qty=models.FloatField()

views.py 在这个视图中,我试图获取特定产品的对象并使用它通过 filter() 获取它的库存记录。

def mStockDetailView(request,id):
    model=mStock
    m=get_object_or_404(mProduct,mProduct_id=id)

    stock=mStock.objects.filter(mStock_product=m.mProduct_name)
    context={
       'stock':stock,
    }

    return render(request,'dairyapp/stock-details.html',context)

模板:productlist.html 我将产品 ID 作为参数传递给 url。

{% for p in product %}
<a href="{% url 'dairyapp:stock-detail' id=p.mProduct_id %}">
 {{p.mProduct_name}}</a>
{%endfor%}

urls.py

 path('stockrecords/<id>',views.mStockDetailView,name='stock-detail'),

尽管如此,我得到了
基数为 10 的 int() 的无效文字:“冰淇淋”错误

谁能提供这个错误的解决方案?

追溯:

Request Method: GET
Request URL: http://localhost:8000/stockrecords/5

Django Version: 2.1.3
Python Version: 3.6.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'dairyapp.apps.DairyappConfig',
 'widget_tweaks']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python3.6/dist-packages/django/core/handlers/base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/media/coder/Multimedia/My Projects/Software/Dairy/Dairy Soft/dairy/dairyapp/views.py" in mStockDetailView
  79.     stock=mStock.objects.filter(mStock_product=m.mProduct_name)

File "/usr/local/lib/python3.6/dist-packages/django/db/models/manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/usr/local/lib/python3.6/dist-packages/django/db/models/query.py" in filter
  844.         return self._filter_or_exclude(False, *args, **kwargs)

File "/usr/local/lib/python3.6/dist-packages/django/db/models/query.py" in _filter_or_exclude
  862.             clone.query.add_q(Q(*args, **kwargs))

File "/usr/local/lib/python3.6/dist-packages/django/db/models/sql/query.py" in add_q
  1263.         clause, _ = self._add_q(q_object, self.used_aliases)

File "/usr/local/lib/python3.6/dist-packages/django/db/models/sql/query.py" in _add_q
  1287.                     split_subq=split_subq,

File "/usr/local/lib/python3.6/dist-packages/django/db/models/sql/query.py" in build_filter
  1225.         condition = self.build_lookup(lookups, col, value)

File "/usr/local/lib/python3.6/dist-packages/django/db/models/sql/query.py" in build_lookup
  1096.         lookup = lookup_class(lhs, rhs)

File "/usr/local/lib/python3.6/dist-packages/django/db/models/lookups.py" in __init__
  20.         self.rhs = self.get_prep_lookup()

File "/usr/local/lib/python3.6/dist-packages/django/db/models/fields/related_lookups.py" in get_prep_lookup
  115.                 self.rhs = target_field.get_prep_value(self.rhs)

File "/usr/local/lib/python3.6/dist-packages/django/db/models/fields/__init__.py" in get_prep_value
  965.         return int(value)

Exception Type: ValueError at /stockrecords/5
Exception Value: invalid literal for int() with base 10: 'Ice Cream'

【问题讨论】:

  • 请发布完整的异常回溯。这将有助于我们回答您的问题。
  • 您应该发布完整的回溯。无论如何,消息说某个地方的某个地方需要一个数字(某行代码正试图将类型转换为 int)正在传递“冰淇淋”。所以也要检查你的数据。
  • 我猜它在这条线上:stock=mStock.objects.filter(mStock_product=m.mProduct_name)。也许m.mProduct_name 应该是m.mProduct_id
  • 'Ice Cream' 错误——我最喜欢的回溯之一
  • 看起来您的回溯不是来自您发布的代码(回溯显示mStock.objects.get,而代码显示mStock.objects.filter)。请更新其中一项以使他们同意。

标签: python django django-models django-templates django-views


【解决方案1】:

根据回溯,我很确定问题出在这一行:

stock=mStock.objects.filter(mStock_product=m.mProduct_name)

您正试图通过过滤指向 mProduct 对象的外键来获取 mStock 对象。您正在使用关键字参数mStock_product,因此传递的值应该引用一个mProduct。您正在传递 m.mProduct_name 这是一个字符串。相反,您应该传递 m.mProduct_id,这是您对 mProject 对象的引用。所以,新行应该是:

stock = mStock.objects.filter(mStock_product=m.mProduct_id)

或者你可以让 Django 找出主键,然后像这样传递对象(感谢 A.L.Flanagan 指出这一点):

stock = mStock.objects.filter(mStock_product=m)

【讨论】:

  • 我相信这也会起作用:stock=mStock.objects.filter(mStock_product=m)。 Django“知道”外键是什么,所以你不必告诉它。
  • @A.L.Flanagan 是的,我认为你是对的。我不记得这是否有效,我在文档中找不到它,我懒得尝试。不过,我会把它作为一个选项添加,谢谢。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多