我有一种方法可行,但看起来非常笨拙,我认为有更好的方法可以做到这一点。
我有一个模型,它将我网站上的用户(用于学习目的的推文克隆)与其他用户列表联系起来。
现在,当我创建新用户时,我希望将该列表初始化为用户作为列表的成员。
我的模特是:
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()两次,但我似乎无法在文档或其他任何地方找到它。
答案 0 :(得分:12)
您不需要在many2many.add()
之后调用save您还可以将代码缩短为2行:
flst = FollowerList.objects.create(follower=user)
flst.followed.add(user)
答案 1 :(得分:4)
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__
关键字参数,同时将所有其他args
和kwargs
传递给默认构造函数。
对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)