2012-05-31 3 views
6

DB에 이미있는 파일에 모델이 몇 개있는 models 폴더가 있습니다. 방금 다른 파일/모델을 추가했지만 syncdb를 실행할 때 DB에 추가되지 않습니다. manage.py 유효성 검사를 시도했는데 제대로 실행 중입니다. 또한 코드를 실행하고 "테이블 존재하지 않는"저장하려고 할 때 실패합니다. __ file2.py
Django 모델이 syncdb 이후에 DB에 나타나지 않습니다.

- file1.py
-
__ 초기화 __ -
/모델
:

원래의 구조는 다음과 같았다 초기화 __ .py는 다음과 같이 보입니다 :

from file1 import File1Model 
from file2 import File2Model 
012 file1.py
- - file2.py
- file3.py


__ 초기화 __ - 3,516,

나는 file3.py
/모델
추가

from file1 import File1Model 
from file2 import File2Model 
from file3 import File3Model 
__ 초기화 __ 를 수정

그리고 file3의 내용 (무고한 사람을 보호하기 위해 이름이 변경되었을 수도 있지만 정확한 파일을 제외하고) :
업데이트 : id 필드가 자동으로 추가되었을 때 기본 키를 추가하려고 시도했습니다. 정수 기본 키 id. 또한 약간의 변화를 시도했지만 주사위는 사용하지 않았습니다.

from django.db import models 
from django.contrib.auth.models import User 


class File3Model(models.Model): 
    user = models.OneToOneField(User) 
    token = models.CharField(max_length=255, blank=False, null=False) 
    id = models.CharField(primary_key=True, max_length=255) 

    class Admin: 
     pass 

    class Meta: 
     app_label = 'coolabel' 

    def __unicode__(self): 
     return self.user.username 

    @staticmethod 
    def getinstance(user, token, id): 
     try: 
      instance = File3Model.objects.get(pk=id) 
      if instance.token != token: 
       instance.token = token 
       instance.save() 
      return instance 
     except: 
      pass 
     instance = File3Model() 
     instance.user = user 
     instance.token = token 
     instance.id = id 
     instance.save() 
     return instance 

따라서이 예제에서 File1Model과 File2Model은 이미 DB에 있으며 syncdb 후에 DB에 남아 있습니다. 그러나 File3Model은 syncdb를 다시 실행 한 후에도 추가되지 않습니다. 새로운 모델이 추가되지 않는 이유를 파악할 방법이 있습니까?

+0

'syncdb --all'을 시도 했습니까? – sultan

+0

방금 ​​시도했지만 여전히 작동하지 않습니다. – ntrrobng

답변

0

붐!

새 모델에 다른 app_label을 사용했지만 모델 그룹 전체에서 동일해야합니다.

다른 모델의 레이블은 "mediocrelabel"이고 새 모델의 레이블은 "coolabel"입니다. 나는 새 모델의 레이블을 "mediocrelabel"로 바꿨고 지금은 DB에 정확하게 추가되고있다.

여러분의 도움에 감사드립니다. 여러분!

9

모델을 models.py 외부에서 정의하는 경우 모델 Meta 클래스에 app_label 속성을 설정해야합니다.

편집 : app_labelINSTALLED_APPS 설정의 앱을 참조해야합니다. 그렇지 않으면 정말 좋은 이유가없는 한 모델 디렉토리가있는 앱의 이름과 일치해야합니다. 그게 네 문제 였어.

class File3Model(models.Model): 
    foo = models.CharField(...) 
    ... 

    class Meta: 
     app_label = "my_app" 

syncdb은 데이터베이스에서 어떤 테이블도 제거하지 않습니다. models.py가 디렉토리 구조로 대체되기 전에 syncdb로 다른 테이블이 생성되었을 수도 있습니다.

+0

app_label 필드는 메타 클래스에 설정되어 있지만 여전히 DB에 추가되지 않습니다. – ntrrobng

+0

'app_label'은'INSTALLED_APPS' 설정에서 app이어야합니다. 나는 이것을 답에 추가했다. – Alasdair

0

models.py에 모델을 배치하는 대신 모델을 분리하고 모델 폴더가있는 이유는 무엇입니까?

내 프로젝트에는 약 10 개의 모델이 models.py에 살고 있으며 그걸로 괜찮습니다.

manage.py syncdb --all도 시도 할 수 있습니다.

그리고 모든 모델을 하나의 파일로 유지하고 models/__init__.py에 필요한 모델을 가져 오는 것을 염두에 두지 않고 from my_app.models import model_name과 같은 형식으로 가져 오는 것이 좋습니다. 그런데 많은 문제를 피하고 길게 늘어선 수입을 피하고 개의 파일에 some_model이 어디에 살고 있는지 상관하지 않습니다.

감사합니다,

술탄

+0

조언 해 주셔서 감사합니다. 그러나 기존 코드로 작업 중이며 모든 것을 models.py 파일로 다시 옮기는 것이 어리석은 일임을 알게되었습니다. 나는 models 디렉토리에 모든 것을 유지하는 것을 선호 할 것이다. – ntrrobng

1

내 앱에 app_label을 설정하면 문제가 해결됩니다.

관련 문제