2014-04-22 151 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

相關問題