2011-04-20 96 views
0

我想用一个ManyToManyField保存一个Django模型实例。当我尝试用create()经理这样做,它产生以下错误:ManyToManyField导致Django模型保存问题

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

谢谢!

回答

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) 

编辑:

好吧,得到它的工作o ñ我的电脑。首先,因为它是多对多的,听起来更好,可以使用不作为模型字段的帖子。嗯反正这是你怎么做:

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() 
+0

我已经知道帖子实例。问题是关键字参数“post”无效,即使它是我的Amenity模型中的M2M字段。 post_id不是一个字段,因此也提高关键字参数错误 – Ben 2011-04-20 03:47:23

+0

嗨,工作。感谢您对帖子和帖子的建议。这是一个很好的观点。我有一些问题:1)为什么我不能用create()管理器创建对象?为什么我不能将post关键字arg添加到编辑版本的Amenity实例构造函数中?我假设这与桌面M2M有关。最后,add方法来自哪里?它只是一个内置的python吗? – Ben 2011-04-20 04:18:41

+0

我想用get_or_create替换Amenity.objects.create,但是我想我需要用post参数来做到这一点。它不适用于create(),所以我认为它不适用于get_or_create – Ben 2011-04-20 04:20:44

0

您不应该通过post.idpost字段,因为post是m2m和django照顾它。你在哪里设置post实例?

+0

没错,所以我早些时候试过通过post实例,而不是post.id,那也失败了。 – Ben 2011-04-20 03:42:36

1

您可能能够通过Amenity.objects.create(posts=[p],name=a)做到这一点,因为帖子预计名单虽然我没有测试它自己 - 我所有的ManyToMany使用through,因为他们增加额外的元数据。

+0

我试过了,没有为我工作。不过,了解M2M领域需要列表非常有用。谢谢! – Ben 2011-04-20 04:39:33

+0

好的,很高兴知道。创建一个'amenity'后,'amenity.posts = [p]'起作用,所以我希望它也可以在'create'中作为一个关键字arg。 – 2011-04-20 05:03:29