6

既に DB にあるファイルにいくつかのモデルを含むモデル フォルダーがあります。別のファイル/モデルを追加しましたが、syncdb を実行しても DB に追加されません。manage.py validate を試しましたが、問題なく動作しています。コードも実行しましたが、「テーブルが存在しません」で保存しようとすると失敗します。

元の構造は次のようなものでした:
/models
-- __ init __ .py
-- file1.py
-- file2.py

そして__ init __ .py は次のようになりました:

from file1 import File1Model
from file2 import File2Model

file3.py
/models
-- __ init __ .py
-- file1.py
-- file2.py
-- file3.pyを追加しました

および変更された__ init __ .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 に残ります。ただし、syncdb を再実行しても File3Model は追加されません。新しいモデルが追加されていない理由を突き止める方法はありますか??

4

4 に答える 4

9

models.py の外でモデルを定義する場合はapp_label、modelsMetaクラスに属性を設定する必要があります。

編集:設定app_labelでアプリを参照する必要がありますINSTALLED_APPS。特別な理由がない限り、models ディレクトリがあるアプリの名前とおそらく一致するはずです。それがあなたの問題だったようです。

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

    class Meta:
        app_label = "my_app"

syncdbデータベースからテーブルを削除することは決してないことに注意してください。他のテーブルは、models.py がディレクトリ構造に置き換えられる前に、syncdb で作成された可能性があります。

于 2012-05-31T16:23:09.333 に答える
0

モデルを配置する代わりに、モデルを分割してモデルフォルダを作成したのはなぜmodels.pyですか?

私自身のプロジェクトでは、約10のモデルが存在し、問題はありませmodels.pyん。

試すこともできますmanage.py syncdb --all

from my_app.models import model_nameまた、必要なモデルをにインポートすることを念頭に置くよりも、すべてのモデルを1つのファイルにまとめてインポートする方がよいと思いますmodels/__init__.py。ちなみに、多くの問題や長蛇の列のインポートを回避し、ファイルsome_model間のどこに存在するかを気にしません。models/*.py

ありがとう、

スルタン

于 2012-05-31T16:33:47.783 に答える
0

ブーム!

新しいモデルには別の app_label を使用していましたが、モデル グループ全体で同じにする必要があります。

他のモデルのラベルは「平凡なラベル」で、新しいモデルのラベルは「クーラベル」でした。新しいモデルのラベルを「平凡なラベル」に変更したところ、DB に正しく追加されるようになりました。

助けてくれてありがとう、皆さん!

于 2012-06-01T08:13:46.107 に答える