2016-12-11 92 views
2

我們有一個通用的超級模特類:爲什麼django loaddata默默爲自定義用戶模型失敗?

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

    objects = InheritanceManager() 

UUIDObject從model_utils使用InheritanceManager和SimpleUUIDField這是Django的UUIDField的一個簡單的專業化與有關字符串值更多的寬容。

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重新加載時,夾具的加載被報告爲成功,但是對象不被添加到表中。當我使用詳細標誌時,它表示夾具中的每個用戶記錄都被添加了兩次(這種排序有意義 - 一個用於根表,一個用於從屬表),但是沒有任何表中出現實際條目。

看來,loaddata只是默默地失敗並報告成功。

+0

是不是更有可能的是,這是一件與你所使用 – e4c5

+0

這可能涉及到第三方應用django fixture處理原始數據的方式(不使用對象管理器或常規保存方法保存模型),但我沒有使用任何特殊的保存方法,對象管理器都是關於查詢集而不是對象創建的任何事情。 –

回答

0

我遇到了同樣的問題,從InheritanceManage的抽象類繼承導致abstract =使用model_utils時,從模型中刪除了True聲明。

我試圖執行保存在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(),因爲save()未由loaddata調用,https://stackoverflow.com/questions/8595536/does-a-models-save-method-get-called-when-using-loaddata -for-fixtures – Travis

+0

也許這就是爲什麼InheritanceManage子類中沒有實際保存在數據庫中的fixture中的對象的原因 – Travis