2016-08-04 7 views
0

두 모델 ArticleArticlePost이 있습니다. Article에 별도의 응용 프로그램에서 ArticlePost 외부 키로 참조 Article하고 있습니다 :Django 외래 키가 관계의 기본 키를 인식하지 못함

operations = [ 
migrations.CreateModel(
    name='ArticlePost', 
    fields=[ 
     ('id', models.AutoField(auto_created=True, verbose_name='ID', serialize=False, primary_key=True)), 
     ('created_at', models.DateTimeField(auto_now_add=True)), 
     ('comment', models.TextField(blank=True)), 
     ('article', models.ForeignKey(to='app2.Article')), 
    ], 
), 
] 

내가 파이썬을 실행할 때 내가 얻을 마이그레이션 관리 :

====app1/models.py:====== 
class Article(models.Model): 

    name = models.CharField(max_length=200, primary_key=True) 

====app2/models.py====== 
class ArticlePost(models.Model): 

    article = models.ForeignKey(Article, null=False, db_index=True) 
    created_at = models.DateTimeField(auto_now_add=True) 
    comment = models.TextField(blank=True) 

내가 파이썬을 실행 한 다음과 같은 준다 makemigrations 관리 : 이상한 무엇

django.db.utils.ProgrammingError: there is no unique constraint matching given keys for referenced table "article" 

내가 또한 참조 app1 다른 모델을 가지고있다 완벽하게 작동하는 외래 키가있는 기사를 포함합니다. 그러나이 경우 장고는 어떤 필드가 Article의 기본 키인지 알지 못합니다. 유일한 차이점은 ArticlePostArticle과 다른 응용 프로그램에 있다는 것입니다. 장고 1.10을 실행 중입니다. 누구나이 문제의 원인과 해결 방법을 알 수 있습니까?

또 다른 중요한 문제 일지 모르지만 해결 방법은 기사에서 primary_key을 제거하고 Django 기본값 인 id을 대신 사용하는 것일 수 있습니다. 이 경우, 다른 모델의 foreign key 참조를 app1 내의 Article으로 유지하면서 어떻게하는 것이 가장 좋습니까?

+0

이 질문에 대한 대답은 아니지만 모델 필드에서'null = False'를 제거 할 수 있습니다. 기본적으로'null = False'입니다. 'True'로 설정한다면'null' 값을 추가하기 만하면됩니다. – jape

답변

0

좋아, 그렇게하려고 한 것은 절대적으로 정확합니다. 하지만 문제는 여기 장고입니다.

그런 다음 공식 문서에 따라 primary_keyname을 설정하는 ->https://docs.djangoproject.com/ja/1.9/ref/models/fields/#django.db.models.Field.unique

primary_key와 = 사실은 진정한 = null이 거짓 독특한 의미한다. >Primary key and unique key in django

을 -

그래서 기술적으로, 당신은

가 (너무 의견을 통해 이동) 참고로이를 참조하지만, 유래에 대한 몇 가지 다른 게시물을 통과 한 후 Article 모델에 고유 한 필드가 할

primary_key=true에 문제가있는 것으로 보입니다. 장고는 기본 키로 간주하지만

unique 그래서 당신이 primary_key=truename를 들어, 다음 장고 이 개체에 대해 고유 한 자동 증가 ID를 소유를 생성하지 않습니다 사용할 때 것으로 보인다. 그러므로 이제 모델 Article에있는 객체에 대한 고유 한 ID가 없으므로 오류가 발생합니다.

따라서 primary_key=true을 제거하고 Django가 고유 한 자동 증분 고유 ID를 사용하게하면 오류가 발생하지 않습니다.

+0

그 Ankush 주셔서 감사합니다. 무슨 일이 일어나고 있는지 알면 좋습니다. 내가 시도 할 때'기본값없이 Article에 nullable 필드가 아닌 'id'를 추가하려고합니다. 우리는 그것을 할 수 없다 (데이터베이스는 기존 행을 채우기 위해 무언가를 필요로한다)'. 기본 설정은 무엇입니까?장고는 기존 레코드를 새로운 ID로 자동 채워 넣을 필요가 있다는 것을 인식하지 못합니다. 두 번째로, 내가 가치를 부여 할 수 있다고 가정하면,'Article'에 대한 외래 키가있는 기존 모델은 어떻게 될 것입니까? 그들은 유지 될 것인가? – mohevi

+0

그렇습니다. Django는 autopopulate해야한다는 것을 인식하지 못합니다. 새로운 객체가 모델에 추가 될 때만 고유 ID가 추가되기 때문입니다. 이제는 새 항목이 추가되지 않으므로 기존 항목을 채우지 않습니다. 나는 당신이 직접'python manage.py shell'을 사용하여 그것들을 추가 한 다음 간단한 루프를 실행 시켜야만 할 것이라고 생각합니다. 또는 데이터를 백업 할 수있는 경우 현재 데이터를 삭제하고 데이터를 다시 추가하십시오. 그렇게하면 새로 생성 된 ID에 대한 ID가 생성됩니다. 새 데이터를 추가하고 새 마이그레이션을 수행하기 전에 모든 마이그레이션을 삭제하십시오. –

+0

그리고 두 번째 질문에 대해서는 잘 모르겠지만 Django가 처음부터 외래 키를 유지하도록 허용하지 않았다면 처음에는 외래 키가 저장되지 않을 것이라고 생각합니다. 맞습니까? 따라서 유지의 시나리오는 그리지 않습니다. 그거야? –