如何在Django中设置ManyToMany字段的值?

时间:2013-07-24 06:23:54

标签: python django models

在学习Django做网络编程的同时,我遇到了这个问题。 我搜索谷歌和Django的官方网站biut找不到任何答案。请帮帮我。

系统环境:

  1. Fedora 18
  2. Python 2.7
  3. Django 1.5.1
  4. Eclipse + PyDev
  5. 运行时:Django的开发服务器

    我的模型包含ManyToMany字段。当我通过django的管理面板设置值时,一切顺利。 以下代码是我的所有型号:

    class Posts(models.Model):
        post_authorid = models.IntegerField(verbose_name=u'Authorid')
        post_date = models.DateTimeField(auto_now_add=True,verbose_name=u'PostDate')
        post_date_modified = models.DateTimeField(auto_now=True,verbose_name=u'LastModifiedTime')
        post_content = models.TextField(verbose_name=u'Content')
        post_title = models.CharField(max_length=50,verbose_name=u'Title')
        post_name = models.CharField(max_length=50,blank=True,verbose_name=u'ShortName') 
        post_cover = models.CharField(max_length=200,verbose_name=u'CoverUrl')      
        post_introduction = models.CharField(max_length=500,blank=True,verbose_name=u'introduction')
        post_status = models.ForeignKey(Status,verbose_name=u'status')
        comment_status = models.BooleanField(verbose_name=u'show_comments')
        post_password = models.CharField(max_length=20,blank=True,verbose_name=u'passwd')
        post_tagid = models.ManyToManyField(Tags,verbose_name=u'tag')
        post_threadtypeid = models.ForeignKey(ThreadTypes,verbose_name=u'ThreadType')
        post_comment_conut = models.IntegerField(verbose_name=u'CommentsCount')
        post_comments = models.ManyToManyField(Comments,blank=True,verbose_name=u'Comment')
        def __unicode__(self):
            return u"%s %s %s" % (self.id,self.post_title,self.post_date)
        class Meta:
            ordering = ['post_date']
    class Tags(models.Model):
        tagname = models.CharField(max_length=20,verbose_name=u'标签名称')
        def __unicode__(self):
            return u"%s %s" % (self.id,self.tagname)
        class Meta:
            ordering = ['id']
    

    在我的python shell中,我输入:

    post = Posts()
    
    post.post_tagid = Tags.objects.get(id='1')
    

    然后django提出了一个http 500错误:

      在可以使用多对多关系之前,

    对象需要具有字段“posts”的值。

    但是,当我使用时:

    post= Posts.objects.get(id='1')
    

    注意 - 我已经通过Django admin输入了Posts对象

    然后,当我使用

    post.post_tagid = Tags.objects.get(id='1')
    
    一切顺利。

    问:如何在不引发此错误的情况下添加ManyToMany字段?

2 个答案:

答案 0 :(得分:16)

看起来这里的问题是你在M2M表中实际创建数据库之前尝试添加一些内容。

当您运行post = Posts()时,您在内存中创建了一个对象,但在数据库中不是。因此,当您尝试向M2M表添加新条目时,没有任何内容可供参考。 (请记住,声明一个M2M字段会导致创建一个新表,其中的记录指向关系的两端。)

解决方案是在尝试添加到M2M表之前运行post.save()。 (Django管理员在幕后为你做这件事。)

所以尝试这样的事情:

post = Posts()

# now set up the post (title, name, etc.)

post.save() # adds a new entry to the Posts table

post.post_tagid.add(tag) # now that your post exists in the DB this should work

答案 1 :(得分:2)

您应该阅读Many-to-many relationships上的官方django文档。

在您的情况下,以下代码应该有所帮助:

# Post object
post= Posts.objects.get(id=1)

# Two tag objects
tag1 = Tags.objects.get(id=1)
tag2 = Tags.objects.get(id=2)


# Add tag objects to Post object
post.post_tagid.add(tag1, tag2)