在Django中实例化具有manytomany字段的模型实例

时间:2010-12-23 04:34:20

标签: django django-models manytomanyfield

我有一种方法可行,但看起来非常笨拙,我认为有更好的方法可以做到这一点。

我有一个模型,它将我网站上的用户(用于学习目的的推文克隆)与其他用户列表联系起来。

现在,当我创建新用户时,我希望将该列表初始化为用户作为列表的成员。

我的模特是:

class FollowerList(models.Model)
    follower = models.ForeignKey(User,related_name="follower")
    followed = models.ManyToManyField(User,related_name="followed"

我现在使用的代码中的代码是

user = User.objects.get(username=uname)
flst = FollowerList()
flst.follower = user
flst.save()
flst.followed.add(user)
flst.save()

在我看来,应该是一种创建它的方法而不需要调用save()两次,但我似乎无法在文档或其他任何地方找到它。

3 个答案:

答案 0 :(得分:12)

您不需要在many2many.add()

之后调用save

您还可以将代码缩短为2行:

flst = FollowerList.objects.create(follower=user)
flst.followed.add(user)

答案 1 :(得分:4)

Yuji的回答是正确的。在保存之前,您无法将对象添加到M2M字段。我想提一下创建实例的简短方法。

user = User.objects.get(username=uname)
flst = FollowerList(follower=user) #use key word args to assign fields
flst.save()
flst.followed.add(user)
# don't need to save after adding an object to many to many field.

我发现语法比创建空实例和分配字段稍微好一些。虽然objects.create()方法(由Yuki提到)仍然更好。

答案 2 :(得分:2)

对此的最新答案:您还可以覆盖构造函数(__init__),如下所示:

class FollowerList(models.Model):
    follower = models.ForeignKey(User,related_name="follower")
    followed = models.ManyToManyField(User,related_name="followed"

    def __init__(*args, followed=[], **kwargs):
        super(FollowerList, self).__init__(*args, **kwargs)
        self.save()
        for user in followed:
            self.followed.add(user)

即我在followed函数中明确处理了__init__关键字参数,同时将所有其他argskwargs传递给默认构造函数。 对save的调用确保对象已经注册,因此可以在m2m关系中使用。

然后,您可以使用一行创建FollowerList,例如

flst = FollowerList(follower=user, followed=[user,])

或者,正如约翰内斯所指出的那样,预计不会在__init__中保存模型。首选方法是创建Manager方法 - 有关详细信息,请参阅此处:https://docs.djangoproject.com/en/1.9/topics/db/managers/ 然后创建FollowerList

fl = FollowerList.objects.create(*args, followed, **kwargs)