首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于DB错误,Django模型SyncDB在选择属性上失败

由于DB错误,Django模型SyncDB在选择属性上失败
EN

Stack Overflow用户
提问于 2011-02-22 03:06:43
回答 2查看 542关注 0票数 0

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

错误:

代码语言:javascript
复制
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...

模型:

代码语言:javascript
复制
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。

有没有什么办法可以在不删除函数并将其放回原处的情况下实现我正在尝试的目标?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2011-02-22 03:53:25

如果你发现自己的选择是动态的,那么你最好使用一个带有ForeignKey的合适的数据库表。选择意味着不会有太多变化的静态数据。

因此,您最好在Log模型中更改您的配置文件字段:

代码语言:javascript
复制
profile = models.ForeignKey(Profile, null=True,blank=True)
票数 2
EN

Stack Overflow用户

发布于 2011-02-22 05:21:18

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5070086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档