我想用ManyToManyField保存Django模型实例。当我尝试使用create()管理器时,它会产生以下错误:
Exception Value:'post' is an invalid keyword argument for this function
这是我的模特:
class Amenity(models.Model):
post=models.ManyToManyField(Post,blank=True,null=True)
name=models.CharField(max_length=50, choices=AMENITIES)
def __unicode__(self):
return str(self.name)
以下是该观点的相关部分:
if request.POST.get('amenities'):
amens=request.POST['amenities'].split(',')
p=int(post.id)
for a in amens:
Amenity.objects.create(post=p,name=a)
return HttpResponse('success')
我正在尝试同时保存多个设施,而且我在模型之外这样做,因为我考虑到了设计,我不想在这种情况下创建自定义字段。
post.id在这里返回正确的值,所以这似乎不是问题。
谢谢!
答案 0 :(得分:2)
有两种方法可以解决这个问题:
1)通过创建另一个数据库:(这是最安全的)
p = Post.objects.get(pk=post.id)
if p:
Amenity.objects.create(post=p, name=a)
else:
...
2)将id传递给post_id
p = int(post.id)
Amenity.objects.create(post_id=p, name=a)
编辑:
好的,让它在我的电脑上工作。首先,因为它是多对多,使用不作为模型字段发布的帖子听起来更好。好吧无论如何这就是你做的:
post = Post.objects.get(pk=id)
for a in amens:
a = Amenity(name=a)
a.post.add(post) #better if it said a.posts.add(post)
a.save()
答案 1 :(得分:1)
您可以通过Amenity.objects.create(posts=[p],name=a)
来完成此操作,因为帖子需要一个列表,但我自己没有对其进行过测试 - 我的所有ManyToMany
都使用了through
,因为他们添加了额外的元数据。
答案 2 :(得分:0)
您不应该将post.id
传递给post
字段,因为post
是m2m而django需要处理它。您在哪里设置post
实例?