15

Django で Web プログラミングを学習しているときに、この問題に直面しました。Google で検索したところ、Django の公式 Web サイトで答えが見つかりませんでした。私を助けてください。

システム環境:

  1. フェドラ18
  2. パイソン 2.7
  3. ジャンゴ 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シェルでは、次のように入力します。

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')

すべてがうまくいきます。

Q:このエラーを発生させずに 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 に答える