2014-03-31 3 views
0

나는 다음과 같은 코드가 있습니다장고 외래 키 - 앱 레지스트리가 준비되지 않았습니다

class A(models.Model): 
    foo = models.DateField(blank=False, null=False) 
    class Meta: 
    get_latest_by = 'foo' 


class B(models.Model): 
    bar = models.ForeignKey(A, default=A.objects.latest()) 

다른 모델의 최신 객체 기본 포함 갈 수있는 방법은 docs이하는 것입니다 따르면합니다.

Traceback (most recent call last): 
    File "/home/bla/workspace/foobar/manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/lib64/python2.7/site-packages/django/core/management/__init__.py", line 427, in execute_from_command_line 
    utility.execute() 
    File "/usr/lib64/python2.7/site-packages/django/core/management/__init__.py", line 391, in execute 
    django.setup() 
    File "/usr/lib64/python2.7/site-packages/django/__init__.py", line 21, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 106, in populate 
    app_config.import_models(all_models) 
    File "/usr/lib64/python2.7/site-packages/django/apps/config.py", line 190, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/home/bla/workspace/foobar/b/models.py", line 15, in <module> 
    class B(models.Model): 
    File "/home/bla/workspace/foobar/b/models.py", line 54, in B 
    bar = models.ForeignKey(A, blank=True, null=True, default=A.objects.latest()) # @UndefinedVariable 
    File "/usr/lib64/python2.7/site-packages/django/db/models/manager.py", line 92, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 497, in latest 
    return self._earliest_or_latest(field_name=field_name, direction="-") 
    File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 491, in _earliest_or_latest 
    return obj.get() 
    File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 346, in get 
    num = len(clone) 
    File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 122, in __len__ 
    self._fetch_all() 
    File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 963, in _fetch_all 
    self._result_cache = list(self.iterator()) 
    File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 265, in iterator 
    for row in compiler.results_iter(): 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 694, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 769, in execute_sql 
    sql, params = self.as_sql() 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 100, in as_sql 
    ordering, o_params, ordering_group_by = self.get_ordering() 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 424, in get_ordering 
    self.query.get_meta(), default_order=asc): 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 460, in find_ordering_name 
    field, targets, alias, joins, path, opts = self._setup_joins(pieces, opts, alias) 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 492, in _setup_joins 
    pieces, opts, alias) 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/query.py", line 1416, in setup_joins 
    names, opts, allow_many, fail_on_missing=True) 
    File "/usr/lib64/python2.7/site-packages/django/db/models/sql/query.py", line 1336, in names_to_path 
    field, model, direct, m2m = opts.get_field_by_name(name) 
    File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 415, in get_field_by_name 
    cache = self.init_name_map() 
    File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 444, in init_name_map 
    for f, model in self.get_all_related_m2m_objects_with_model(): 
    File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 560, in get_all_related_m2m_objects_with_model 
    cache = self._fill_related_many_to_many_cache() 
    File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 574, in _fill_related_many_to_many_cache 
    for klass in self.apps.get_models(): 
    File "/usr/lib64/python2.7/site-packages/django/utils/lru_cache.py", line 101, in wrapper 
    result = user_function(*args, **kwds) 
    File "/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 156, in get_models 
    self.check_ready() 
    File "/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 119, in check_ready 
    raise RuntimeError("App registry isn't ready yet.") 
RuntimeError: App registry isn't ready yet. 

내 설정 파일이 INSTALLED_APPS에서 앱 (A와 B) 모두를 포함 : 나는 응용 프로그램 (python manage.py runserver)를 실행하거나 마이그레이션 (python manage.py makemigrations) 나는이 역 추적을 얻을 일을하려고하고 있는지 여부

.

장고 버전 1.7a2를 사용하고 있습니다. 는 다시 documentation이 오류에 뭔가가 있습니다 RuntimeError: App registry isn't ready yet. This happens when importing an application configuration or a models module triggers code that depends on the app registry.

을하지만 내 모델에 따라 적용하는 방법을 알아낼 수 없습니다.

도움을 주시면 감사하겠습니다. 고마워요

답변

1

저는 장고가 먼저 모델 클래스의 유효성을 검사한다고 생각하는 경향이 있습니다. 그런 다음에 만 값에 대해 데이터베이스를 치는 것을 허용합니다.

또한 예제의 코드는 기본적으로 응용 프로그램 시작 순간에 최신 A 값을 얻는다는 것을 의미합니다. 새 A 레코드를 추가해도 상관없이 기본 막대가이 오래된 값에 바인드됩니다.

최근 A에 대한 동적 검색을 원한다면 (가치 있다고 생각되는) callable을 전달합니다.

시도이 (제거 노트 괄호)로 줄을 교체하려면 : 이미 B 것은 생성 된 A의 "객체"멤버가 있는지 정확히 잘 모릅니다

bar = models.ForeignKey(A, default=A.objects.latest) 

, 그래서 당신은 더 자세한 권 해드립니다 것이지만, 신뢰할 수있는 방법 :

def latest_A(): 
    return A.objects.latest() 

class B(models.Model): 
    bar = models.ForeignKey(A, default=latest_A) 

차이를 보려면, 코드에 해당이 같다 :

latest_A_on_start = A.objects.latest() # got it only once 

class B(models.Model): 
    bar = models.ForeignKey(A, default=latest_A_on_start) #it s just "static" value 
+0

수는 당신이 의미하는 바를 정교하게 만드십시오 :'어떤 새로운 A 레코드를 추가해도 기본 막대가이 오래된 값에 묶여 있습니다. ' 예를 들어, 새 B를 추가합니다. 기본값은 최신 A입니다. 그런 다음 새 A를 추가하고 나중에 새 B를 추가합니다. 두 번째 B는 첫 번째 것과 다른 기본값을 갖습니다. 권리? –

+0

아니, 귀하의 코드에 대한 그들은 함수 호출 연산자가 시작시 계산 된 값으로 바뀝니다 원인 동일합니다. 새 수정보기 –