2016-09-01 14 views
0

は、いくつかの小さな偏差でDjangoの1.10のためのtutorialに続いて期待通りに動作していないサブディレクトリ内のアプリケーションモデル:ジャンゴ1.10から

  • pollsアプリはmysite/apps/pollsに存在し、apps.polls経由でプロジェクトにアクセスされます。
  • デフォルトmodels.pyファイルが削除されていて、新しいモジュールが追加されました:
 
    mysite/ 
    | 
    |- apps/ 
    | |- polls/ 
    | | |- models/ 
    | | | |- __init__.py 
    | | | |- Question.py 
    | | | |- Choice.py 

apps/polls/models/__init__.pyQuestionChoiceの両方を輸入している、との両方のモデルはdjango.db.models.Modelから拡張しています。

問題
makemigrationsを実行すると、例外がスローされます:それはdjango.db.models.Modelから延びるれるよう

 
Traceback (most recent call last): 
    File "/mysite/lib/python3.5/site-packages/django/db/models/fields/related.py", line 742, in __init__ 
    to._meta.model_name 
AttributeError: module 'apps.polls.models.Question' has no attribute '_meta' 

はしかし、Questionモデルは明らかに、_meta属性を持っています。 Django 1.7以降では、_meta.app_labelを定義する必要はありません(いずれにしても、app_labelの定義は機能しません)。プロジェクト全体で追加のリファクタリングをせずに、サブディレクトリのモデルを使用できるようにするために必要なことは何ですか?

追加リソース

+1

「Question」_module_には属性「_meta」がありません。あなたの命名計画が混乱を招いているようです。Btw、あなたのアプリケーションのルートパッケージにあなたのモデルをインポートすることはできません( 'apps/polls/__ init __。py')。 – knbk

+0

@knbkよ、良いキャッチ。だから問題は、何らかの理由で、「質問」が_モジュール_として取り上げられているということです。なぜか、それを解決する方法は?そして、それは実際はちょっとしたタイプミスです。モデルは 'apps/polls/models/__ init __。py'にインポートされています。私はそれを修正するために投稿を編集します。 – Ben

+0

完全なトレースバックとそのファイルを 'apps/polls/models /'の中に表示できますか? – knbk

答えて

2

あなたはQuestionモジュール私をインポートしますQuestionモデルのnstead。あなたはこのようにそれを変更する必要があります。

ここ
from django.db import models 

from .Question import Question 


class Choice(models.Model): 
    question = models.ForeignKey(Question, 
           on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=250) 
    votes = models.IntegerField(default=0) 

最初.Questionは、モジュールを指し、第二Questionは、モデルを指します。同じことがapps/polls/models/__init__.pyのインポートステートメントに当てはまります。

モジュールとクラスを区別する名前付けスキームを使用することをお勧めします。これにより、実際にインポートしているものが混乱することはありません。通常、モジュール名には小文字を、クラス名にはCamelCaseを使用します。それはあなたにquestions.pyclass Question(models.Model):を与えるでしょう。

mysite/ 
| 
|- apps/ 
| |- polls/ 
| | |- models/ 
| | | |- __init__.py 
| | | |- question.py 
| | | |- choice.py 

そして:

# apps/polls/models/choice.py 
from django.db import models 

from .question import Question 


class Choice(models.Model): 
    question = models.ForeignKey(Question, 
           on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=250) 
    votes = models.IntegerField(default=0) 

そのような規則に従うことにより、モジュールquestionQuestionとモデル間の違いは一目で明らかです。

関連する問題