【问题标题】:Why does django loaddata fail silently for custom user model?为什么 django loaddata 对于自定义用户模型静默失败?
【发布时间】:2016-12-11 23:37:43
【问题描述】:

我们有一个通用的超级模型类:

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 只是默默地失败并报告成功。

【问题讨论】:

  • 这不是更有可能与您正在使用的第三方应用程序有关
  • 这可能与 django 夹具处理原始数据的方式有关(在不使用对象管理器或普通保存方法的情况下保存模型)但我没有使用任何特殊的保存方法和对象管理器都是关于查询集,而不是与对象创建有关。

标签: django


【解决方案1】:

我遇到了从 InheritanceManage 继承的抽象类的相同问题,因为使用 model_utils 时从模型中删除了 abstract=True 声明。

我尝试在 post_save 方法中执行 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)

【讨论】:

  • 这可能是一种解决方法,但在 post_save 中再次保存??
  • 我这里尝试执行save(),因为loaddata没有调用save(),stackoverflow.com/questions/8595536/…
  • 也许这就是夹具中的 InheritanceManage 子类对象没有实际保存在数据库中的原因
猜你喜欢
  • 2018-11-28
  • 2012-03-28
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多