Как установить значение поля ManyToMany в Django?
изучая Django для веб-программирования, я столкнулся с этой проблемой. Я искал Google и официальный сайт Django biut не мог найти никакого ответа. Пожалуйста, помогите мне.
системные требования:
- Fedora 18
- Python 2.7
- Джанго 1.5.1
- Затмение + Пункт 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)