ManyToManyField导致Django模型保存问题

时间:2011-04-20 03:18:38

标签: django django-models

我想用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在这里返回正确的值,所以这似乎不是问题。

谢谢!

3 个答案:

答案 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实例?