2014-04-22 152 views
1

我试图对象保存到数据库中,但我得到的错误:Django的错误:类型错误:int()函数的参数必须是字符串或数字,而不是“BuildsTable”

TypeError: int() argument must be a string or a number, not 'BuildsTable'

我有一个单独的脚本,应该用许多主板名称和价格填充我的数据库。

我的models.py如下:

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() 

我的数据库填充文件名为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() 

我怎么能填充我的数据库与主板列表?

我完全回溯:

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' 
+0

完整的追溯? – Hyperboreus

+0

感谢您检查了这一点,我编辑了这个问题。 – achabacha322

+0

只需将'mydb = BuildsTable(moboListing = mobo,price = price_local)'改为'mydb = BuildsTable.objects.create(moboListing = mobo,price = price_local)' – karthikr

回答

1

的问题是,mydb无法保存,因为你设置BuildsTable对象到一个整数字段。试想一下:

try: 
    price_local = BuildsTable(moboListing="%s" % item[1]) 
except BuildsTable.DoesNotExist: 
    price_local = 1 
# ... 
mydb = BuildsTable(moboListing = mobo, price = price_local) 

你去那里,设置priceBuildsTable而不是整数。这不起作用。

顺便说一句,你的其他try-catch也是可疑的,你设置mobo = BuildsTable(moboListing="%s" % item[0]),然后使用mobo作为moboListing的值。

最后,你知道整个脚本是一个肮脏的黑客。从脚本操作Django的正确方法是编写custom Django admin commands。这确实不难,你会得到更强大和可靠的解决方案。

+0

感谢您的答案,所以基本上这是一个不行,我应该使用django-admin命令重写代码? – achabacha322

+0

是的。这不会是一个很大的努力,基本上你只需要将你的代码封装在Django的结构中。它会消除你有时候可能会遇到的一些奇怪的行为,所以早期采用这种技术是很好的。 – janos

+0

谢谢,我正在研究这个问题,并在这里发布结果。新的python。 – achabacha322

相关问题