由于DB错误,Django Model SyncDB在choices属性上失败

时间:2011-02-21 19:06:43

标签: django django-models

这是我在django项目中尝试使用syncdb时遇到的一个小错误。

错误:

Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 219, in execute
    self.validate()
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 249, in validate
    num_errors = get_validation_errors(s, app)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/validation.py", line 28, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 146, in get_app_errors
    self._populate()
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 61, in _populate
    self.load_app(app_name, True)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 78, in load_app
    models = import_module('.models', app_name)
  File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/opt/admin-site/adminsite/cfadmin/models.py", line 111, in <module>
    class RequestLog(models.Model):
  File "/opt/admin-site/adminsite/cfadmin/models.py", line 117, in RequestLog
    profile     = models.PositiveIntegerField(null=True,blank=True, choices=get_profiles()) # It cannot be a foreign key this is not on the same DB 
  File "/opt/admin-site/adminsite/cfadmin/models.py", line 107, in get_profiles
    cache.set('profiles_choices', profiles_choices, 3600)
  File "/usr/local/lib/python2.6/dist-packages/django/core/cache/backends/locmem.py", line 83, in set
    self._set(key, pickle.dumps(value), timeout)
  File "/usr/lib/python2.6/copy_reg.py", line 84, in _reduce_ex
    dict = getstate()
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 61, in __getstate__
    len(self)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 81, in __len__
    self._result_cache = list(self.iterator())
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 947, in iterator
    for row in self.query.get_compiler(self.db).results_iter():
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 672, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 727, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "cfadmin_profile" does not exist
LINE 1: ...dmin_profile"."id", "cfadmin_profile"."name" FROM "cfadmin_p...

模特:

class Profile(models.Model):
    name        = models.CharField(max_length=256)
    categories  = models.ManyToManyField(Category)

    def __unicode__(self):
        return self.name

    class Meta():
        ordering = ["name"]

def get_profiles():
    profiles_choices = cache.get('profiles_choices')
    if profiles_choices == None:
        try:
            profiles_choices = Profile.objects.values_list('id','name')
            cache.set('profiles_choices', profiles_choices, 3600)
        except:
            logging.info("Failed to retrieve the profile choices.")
            pass

    return profiles_choices


class Log(models.Model):
    domain      = models.CharField(max_length=512)
    profile     = models.PositiveIntegerField(null=True,blank=True, choices=get_profiles()) # this is where I get the error on Syncdb


    def __unicode__(self):
        return self.domain

    class Meta():
        ordering = ["domain"]

因此,如果我正在同步一个新项目,我将收到我之前提到的错误。 如果我在模型选项中删除了对我的函数get_profiles()的调用,它将同步并且没有错误。

但我不明白为什么我仍然得到错误,即使我在函数中放了一个try catch。 因此,如果出现错误,我希望它会继续,但它会完全中止syncdb。

在没有移除功能并将其放回去的情况下,是否有实现我正在尝试的目标?

谢谢!

2 个答案:

答案 0 :(得分:2)

来自django doc“...如果您发现自己选择了动态的选择,那么最好使用带有ForeignKey的正确数据库表。选择适用于不会改变的静态数据很多,如果有的话。“

因此,您最好更改Log模型中的个人资料字段:

profile = models.ForeignKey(Profile, null=True,blank=True)

答案 1 :(得分:2)

这是获取模型选择的方式。即使你修复了循环依赖问题,你仍然会遇到get_choices()函数在服务器进程启动时将被调用的问题,并且在此期间不会发生变化。与default不同,我不相信choices可以是可调用的。