15

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

系统环境:

  1. 软呢帽 18
  2. 蟒蛇 2.7
  3. Django 1.5.1
  4. Eclipse + PyDev

运行时: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 字段?

4

2 回答 2

24

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

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

解决方案是post.save()在尝试添加到 M2M 表之前运行。(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
于 2013-07-24T08:58:35.673 回答
5

您应该阅读有关多对多关系的官方 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)
于 2013-07-24T06:38:01.930 回答