【问题标题】:Django Error: TypeError: int() argument must be a string or a number, not 'BuildsTable'Django 错误:TypeError:int() 参数必须是字符串或数字,而不是“BuildsTable”
【发布时间】:2014-04-23 04:09:25
【问题描述】:

我正在尝试将对象保存到数据库中,但出现错误:

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'

【问题讨论】:

  • 感谢您查看此问题,我编辑了问题。
  • 只需将mydb = BuildsTable(moboListing = mobo, price = price_local) 更改为mydb = BuildsTable.objects.create(moboListing = mobo, price = price_local)
  • 谢谢,我试过了,但遇到了类似的错误。

标签: python django


【解决方案1】:

问题是mydb 无法保存,因为您将BuildsTable 对象设置为整数字段。考虑一下:

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

你去吧,将 price 设置为 BuildsTable 而不是整数。这行不通。

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

最后,您知道整个脚本是一个肮脏的 hack。从脚本中操作 Django 的正确方法是编写 custom Django admin commands。这真的不难,而且您将获得更强大和可靠的解决方案。

【讨论】:

  • 感谢您的回答,所以基本上这是不行的,我应该使用 django-admin 命令重写代码?
  • 是的。这不会是一个很大的努力,基本上你只需要将你的代码包装在 Django 的结构中。它会消除您有时可能会遇到的一些奇怪行为,因此最好尽早采用该技术。
  • 谢谢,我会努力解决这个问题,然后将结果发回这里。 python新手。
猜你喜欢
  • 2015-12-03
  • 2012-03-04
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2019-09-16
  • 2018-07-05
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多