Как установить значение поля ManyToMany в Django?

изучая Django для веб-программирования, я столкнулся с этой проблемой. Я искал Google и официальный сайт Django biut не мог найти никакого ответа. Пожалуйста, помогите мне.

системные требования:

  1. Fedora 18
  2. Python 2.7
  3. Джанго 1.5.1
  4. Затмение + Пункт 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 я ввожу:

post = Posts()

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

затем django rasise ошибка http 500:

объект должен иметь значение для поля "сообщения", прежде чем можно будет использовать это отношение "многие ко многим".

но,когда я использую :

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

Примечание-я ввел объект сообщений администратором Django

тогда,когда я использовать

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

все идет хорошо.

Q: Как я могу добавить поле ManyToMany без этого повышения ошибки?

2 ответов


похоже, проблема здесь в том, что вы пытаетесь добавить что-то в таблицу 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

вы должны прочитать официальные документы 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)