Django错误:TypeError:int()参数必须是字符串或数字,而不是“BuildsTable” [英] Django Error: TypeError: int() argument must be a string or a number, not 'BuildsTable'
问题描述
TypeError:int()参数必须是一个字符串或数字,而不是BuildsTable
我有一个单独的脚本,应该使用多个主板名称填充我的数据库,价格。
我的models.py看起来像这样:
from django。 db进口模型
#在这里创建您的模型。
class BuildsTable(models.Model):
id = models.AutoField(primary_key = True)
moboListing = models.CharField(max_length = 200)
price = model.IntegerField()
我的数据库填充文件称为fillDB.py:
import sys
import os
如果__name__ ==__main__:
sys.path.append('/ home / waleedasif322 / Documents / cb / computerbuilder_masterrepo / computerbuilder /')
os.environ.setdefault(DJANGO_SETTINGS_MODULE,computerbuilder.settings)
从builds.models import buildsTable
mobo = BuildsTable.objects.all()
打印mobo
moboDB = open(db.txt,r )
lines = moboDB.read()。split('\,')
打印行
def main():
全局行
全局BuildsTable
行项目:
try:
mobo = BuildsTable(moboListing =%s%item [0])
except Bu ildsTable.DoesNotExist:
mobo = 1
try:
price_local = BuildsTable(moboListing =%s%item [1])$ b $ b除了BuildsTable.DoesNotExist:
price_local = 1
if(BuildsTable.objects.filter(
moboListing = mobo,price = price_local).exists()== False):
mydb = BuildsTable(moboListing = mobo,price = price_local)
打印mydb
mydb.save()
main()
如何使用主板列表填充数据库?
我的完整追溯:
追溯(最近的最后一次调用):
文件fillDB.py,行40,在< module>
main()
文件fillDB.py,第38行,主要
mydb.save()
文件/ home / waleedasif322 / Documents / cb / computerbuilder_masterrepo / cbenv /local/lib/python2.7/site-packages/django/db/models/base.py,第545行,保存
force_update = force_update,update_fields = update_fields)
文件/ home / waldeasif322 / Documents / cb / computerbuilder_masterrepo / cbenv / local / lib / python2.7 / site-packages / django / db / models / base.py,第573行,在save_base
已更新= self._save_table(raw, cls,force_insert,force_update,using,update_fields)
文件/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/base.py ,第654行,_save_table
result = self._do_insert(cls._base_manager,using,fields,update_pk,raw)
文件/ home / waleedasif322 / Documents / cb / computerbuilder_masterrepo / cbenv / local / lib / python2.7 / site-packages / django / db / models / base.py,第687行,_do_insert
using = using,raw = raw)
文件/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/manager.py,第232行,_insert
return insert_query(self.model,objs,fields,** kwargs)
文件/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django /db/models/query.py,第1511行,insert_query
return query.get_compiler(using = using).execute_sql(return_id)
文件/ home / waleedasif322 / Documents / cb / computerbuilder_masterrepo / cbenv / local / lib / python2.7 / site-packages / django / db / models / sql / compiler.py,行898,在execute_sql
中为sql,params in self.as_sql():
文件/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py,第856行,as_sql
for obj in self.query.objs
文件/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-pac kages / django / db / models / fields / __ init__.py,第350行,get_db_prep
_save
prepared = False)
文件/ home / waleedasif322 / Documents / cb / computerbuilder_masterrepo / cbenv / local / lib / python2.7 / site-packages / django / db / models / fields / __ init__.py,第342行,get_db_prep
_value
value = self.get_prep_value(value)
文件/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py,第1073行,在get_prep_v
alue
返回int(value)
TypeError:int()参数必须是字符串或数字,而不是BuildsTable
问题是 mydb
无法保存,因为您正在设置一个 BuildsTable
对象到整数字段。考虑一下:
try:
price_local = BuildsTable(moboListing =%s%item [1])
除了BuildsTable.DoesNotExist:
price_local = 1
#...
mydb = BuildsTable(moboListing = mobo,price = price_local)
您可以将价格
设置为 BuildsTable
而不是整数。这将无法正常工作。
您的其他try-catch也是可疑的,您设置的位置 mobo = BuildsTable(moboListing =%s %item [0])
,然后再使用 mobo
作为 moboListing
最后,你知道整个脚本是一个脏的黑客。从脚本中操作Django的正确方法是编写自定义Django管理命令。这真的不难,你会得到更强大和可靠的解决方案。
I'm trying to save an object to the database but I get the error:
TypeError: int() argument must be a string or a number, not 'BuildsTable'
I have a separate script that is supposed to populate my database with many names of motherboards, and prices.
My models.py looks like this:
from django.db import models
# Create your models here.
class BuildsTable(models.Model):
id = models.AutoField(primary_key=True)
moboListing = models.CharField(max_length=200)
price = models.IntegerField()
My database populating file is called fillDB.py:
import sys
import os
if __name__ == "__main__":
sys.path.append('/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/computerbuilder/')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "computerbuilder.settings")
from builds.models import BuildsTable
mobo = BuildsTable.objects.all()
print mobo
moboDB = open("db.txt", "r")
lines = moboDB.read().split('\",')
print lines
def main():
global lines
global BuildsTable
for item in lines:
try:
mobo = BuildsTable(moboListing="%s" % item[0])
except BuildsTable.DoesNotExist:
mobo = 1
try:
price_local = BuildsTable(moboListing="%s" % item[1])
except BuildsTable.DoesNotExist:
price_local = 1
"""
if(BuildsTable.objects.filter(
moboListing = mobo, price = price_local).exists() == False):
"""
mydb = BuildsTable(moboListing = mobo, price = price_local)
print mydb
mydb.save()
main()
How can I populate my database with a list of motherboards?
My full traceback:
Traceback (most recent call last):
File "fillDB.py", line 40, in <module>
main()
File "fillDB.py", line 38, in main
mydb.save()
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/base.py", line 545, in save
force_update=force_update, update_fields=update_fields)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/base.py", line 573, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/base.py", line 654, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/base.py", line 687, in _do_insert
using=using, raw=raw)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/manager.py", line 232, in _insert
return insert_query(self.model, objs, fields, **kwargs)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/query.py", line 1511, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 898, in execute_sql
for sql, params in self.as_sql():
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 856, in as_sql
for obj in self.query.objs
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 350, in get_db_prep
_save
prepared=False)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 342, in get_db_prep
_value
value = self.get_prep_value(value)
File "/home/waleedasif322/Documents/cb/computerbuilder_masterrepo/cbenv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1073, in get_prep_v
alue
return int(value)
TypeError: int() argument must be a string or a number, not 'BuildsTable'
The problem is that mydb
cannot be saved, because you're setting a BuildsTable
object to an integer field. Consider this:
try:
price_local = BuildsTable(moboListing="%s" % item[1])
except BuildsTable.DoesNotExist:
price_local = 1
# ...
mydb = BuildsTable(moboListing = mobo, price = price_local)
There you go, setting price
to a BuildsTable
instead of an integer. This won't work.
Btw your other try-catch is suspicious too, where you set mobo = BuildsTable(moboListing="%s" % item[0])
, and then later use mobo
as the value of moboListing
.
Finally, you know that the whole script is a dirty hack. The right way to manipulate Django from scripts is to write custom Django admin commands. It's really not harder, and you'll get more robust and reliable solutions.
这篇关于Django错误:TypeError:int()参数必须是字符串或数字,而不是“BuildsTable”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!