数据插入错误:无效的整数文字(int(),基数:10)

1 投票
2 回答
2471 浏览
提问于 2025-04-16 07:05

我在Google App Engine上使用Django-nonrel。我想往数据库里添加一行数据,但在使用save()的时候遇到了这个错误:

无效的整数值,无法转换为10进制

这是我的代码:

views.py

from django import forms
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from forms import SayForm
from models import Saying, Category
import datetime

def say_something(request):
if request.method == 'POST':
    form = SayForm(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        content = cd['content']
        category_temp = "Uncategorized"
        category = Category.objects.get(name = category_temp)
        added_date = datetime.datetime.now()
        added_user = request.user
        saying = Saying(content, category, added_date, added_user)
        saying.save()
        return HttpResponseRedirect('/contribute/success')
else:
    form = SayForm()
return render_to_response('say_form.html', {'form' : form})

models.py

from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    name = models.CharField(max_length = 50)

    def __unicode__(self):
        return self.name

class Saying(models.Model):
    content = models.CharField(max_length = 160)
    category = models.ForeignKey(Category)
    added_date = models.DateField()
    added_user = models.ForeignKey(User)

forms.py

from django import forms

class SayForm(forms.Form):
    content = forms.CharField(widget = forms.Textarea)

    def clean_message(self):
        content = self.cleaned_data['content']
        num_characters = len(content)
        if num_characters > 160:
            raise forms.ValidationError("Please limit your saying to 160 characters only.")
        num_words = len(content.split())
        if num_words < 4:
            raise forms.ValidationError("This doesn't make sense. Say something longer.")
        return content

补充:这是错误追踪信息

追踪信息:文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/core/handlers/base.py" 在 get_response 107. response = callback(request, *callback_args, **callback_kwargs)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/contrib/auth/decorators.py" 在 _wrapped_view 25. return view_func(request, *args, **kwargs)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/core/views.py" 在 say_something 36. saying.save()

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/base.py" 在 save 452. self.save_base(using=using, force_insert=force_insert, force_update=force_update)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/base.py" 在 save_base 550. for f in meta.local_fields]

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py" 在 inner 28. return func(*args, **kwargs)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py" 在 inner 28. return func(*args, **kwargs)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/init.py" 在 get_db_prep_save 280. return self.get_db_prep_value(value, connection=connection, prepared=False)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py" 在 inner 53. return func(*args, **kwargs)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/init.py" 在 get_db_prep_value 492. return connection.ops.value_to_db_auto(value)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/djangotoolbox/db/base.py" 在 value_to_db_auto 68. return super(NonrelDatabaseOperations, self).value_to_db_auto(value)

文件 "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/backends/init.py" 在 value_to_db_auto 485. return int(value)

异常类型:ValueError 在 /contribute/ 异常值:无效的 整数值,无法转换为10进制:'test'

我感觉问题可能出在我保存对象到数据库的方式上。也许是外键的部分?因为我最近才开始学习Django,所以还不能准确找到问题所在。这个问题和Django-nonrel使用GAE的后端有关系吗?有没有人能告诉我我哪里出错了?

2 个回答

3

像这样创建一个实例会把你的模型的主键设置为 content

saying = Saying(content, category, added_date, added_user)

这样做是行不通的,因为你的模型默认有一个数字类型的主键,所有模型都是这样,除非你特别指定使用其他字段作为主键。当Django试图把这个值转换成整数时,就会因为类型错误而崩溃。

你应该使用关键字参数,像这样:

saying = Saying(content = content, ... = ...)

这样做是比较标准的方式,因为你反正是想保存这个对象:

saying = Saying.objects.create(content = content, ... = ..)
5

问题出在这里:

saying = Saying(content, category, added_date, added_user)

你可能忘了,Django会自动给模型添加一个叫做id的字段。如果你在命令行中做了这个操作,然后打印saying.__dict__,你会发现内容被分配给了id,类别被分配给了content,等等。

所以,创建模型实例的时候,最好总是使用关键字参数:

saying = Saying(content=content, 
                category=category, 
                added_date=added_date, 
                added_user=added_user)

撰写回答