【问题标题】:Where is the update method on the BaseUserManager class?BaseUserManager 类的更新方法在哪里?
【发布时间】:2018-06-21 17:13:33
【问题描述】:

我有以下类创建一个新用户,并且该用户在 kwargs 字典中有一个 m2m 对象,并且更新会创建此错误:“SomeUser”对象没有属性“更新”。

class SomeUserManager(BaseUserManager):
    def _create_user(self, email, password=None, is_superuser=False, **kwargs):
        if type(kwargs['m2mobject']) is list:
            m2mobject = kwargs['m2mobject'].pop(0)
        user = self.model(email=email, is_superuser=is_superuser, **kwargs)
        if password:
            user.set_password(password)
        user.save()
        user.update(m2mobject=m2mobject)
        return user

    def create_user(self, email, password=None, **kwargs):
        return self._create_user(email, password, is_superuser=False, **kwargs)

    def create_superuser(self, email, password, **kwargs):
        return self._create_user(email, password, is_superuser=True, **kwargs)

我必须从 kwargs 中删除这个 m2mobject,以便可以首先创建用户,然后通过这个更新方法我可以将 m2m 对象添加到用户。为什么 Django 不只添加 m2mobject,所以我不必从 kwargs 中删除 m2mobject?如果我不这样做,我会收到此错误

Cannot add "m2mobject": instance is on database "None", value is on database "default"

任何帮助将不胜感激。

【问题讨论】:

  • 抱歉,我使用 Django/Python 已经 3 年了。我没有编写此代码,只是试图修复它。如果我尝试:if type(m2mobject) is M2mobject: user.m2mobject = m2mobject'M2mobject' 对象不可迭代

标签: django python-3.x django-models django-managers


【解决方案1】:

update 是查询集上的方法,而不是模型实例。要将对象添加到 m2m 字段,请在字段本身上使用 add 方法。

user.m2mobject.add(m2mobject)

【讨论】:

  • 谢谢,那行得通,但现在我的问题是,如果用户尝试使用多个 m2mobject 创建,我会收到错误:Cannot add "m2mobject": instance is on database "None", value is on database "default" 在线:user = self.model(email=email, is_superuser=is_superuser, **kwargs)
  • 那是因为pop(0) 只删除列表的第一项。尝试使用类似m2mobjects = kwargs.pop('m2mobject',[]) 的方式从 kwargs 中删除整个列表。然后您可以稍后将此列表与user.m2mobject.add(m2mobjects) 一起使用。
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2012-12-01
相关资源
最近更新 更多