2016-12-11 7 views
2

我々は、一般的なスーパーモデルクラスを持っている:カスタムユーザーモデルでdjango loaddataがサイレントモードで失敗するのはなぜですか?

class UUIDObject(models.Model): 
    id = SimpleUUIDField(primary_key=True, default=uuid.uuid4) 

    objects = InheritanceManager() 

UUIDObjectは、文字列値に関するより寛容でDjangoのUUIDFieldの簡単な専門であるmodel_utilsからInheritanceManagerとSimpleUUIDFieldを使用しています。

UUIDObjectを使用すると、モデルタイプを気にすることなくモデルインスタンスをidで取得できます。

アプリのユーザーモデルは、このようにUUIDObjectから継承:

from django.contrib.auth.models import AbstractUser, UserManager as DjangoUserManager 
from model_utils.managers import InheritanceManager 

class UserManager(InheritanceManager, DjangoUserManager): 
    pass 


class User(AbstractUser, UUIDObject): 
    objects = UserManager() 

再要因の上に開発者を維持するために、我々は利便性のために開発者の治具を保ちます。これは例えばdjango-admin.py dumpdata core.user --indent 2 > devs.jsonで簡単に作成され、結果のファイルは正しく見えます。例えばdjango-admin.py loaddata devsのように再ロードされた場合、フィクスチャのロードは成功として報告されるが、オブジェクトはテーブルに追加されない。冗長フラグを使用すると、フィクスチャ内の各ユーザレコードが2回追加されていることがわかります(ソートは理にかなっています - ルートテーブル用と依存テーブル用)。

loaddataが黙って失敗し、成功したように見えているようです。

+0

が、これはあなたがそれがに関連することができる – e4c5

+0

を使用しているサードパーティ製のアプリとは何かであること、それは可能性が高いではないですdjangoのフィクスチャがrawデータを処理する方法(オブジェクトマネージャや通常のsaveメソッドを使用せずにモデルを保存する)ですが、私は特別な保存メソッドを使用していません。オブジェクトマネージャはオブジェクト作成とは関係なくすべてクエリーセットに関するものです。 –

答えて

0

InheritanceManageから継承した抽象クラスで同じ問題が発生しました。原因:model_utilsを使用しているときに、モデルから真の宣言が削除されました。

私はpost_save方法で()の保存を実行しようとすると、これまでの作品:

from django.db.models.signals import post_save 


class ProductA(AbstractProduct): 
    pass 


def instance_post_save(sender, instance, created, **kwargs): 
    if kwargs.get('raw'): 
     instance.save() 
    return 


post_save.connect(instance_post_save, sender=ProductA) 
+0

回避策としてメリットがあるかもしれませんが、post_saveに再度保存しますか? –

+0

save()はloaddata、https://stackoverflow.com/questions/8595536/does-a-models-save-method-get-called-when-using-loaddataによって呼び出されないため、ここでsave()を実行しようとしています。 -for-fixtures – Travis

+0

これはおそらく、データベースに実際に保存されていないフィチャーのInheritanceManageサブクラスオブジェクトがその理由です – Travis

関連する問題