5

次のDjangoモデルがあります:

class Icon(models.Model):
    name = models.CharField(max_length=200,null=False,blank=False)

class Post(models.Model):
    icons = models.ManyToManyField(Icon)

次のコードを書くと:

post = Post()
icons = []
icon_id = form.cleaned_data['icon_1']
if (icon_id):
    i = Icon.objects.get(id=icon_id)
    icons.append(i)

icon_id = form.cleaned_data['icon_2']
if (icon_id):
    i = Icon.objects.get(id=icon_id)
    icons.append(i)

post.icons = icons
post.save()

Post オブジェクトと 2 つの Icon オブジェクトを作成すると、ほとんどの場合問題なく動作します。

ただし、icon_id がどちらの場合も 1 の場合、データベースには 2 つではなく 1 つのエントリしか作成されません。

したがって、重複をチェックして削除するようです。

重複を許可するようにこれを機能させるにはどうすればよいですか? (投稿に関連付けられた同じアイコンが 2 つ必要です。)

ありがとう!

4

1 に答える 1

12

このような一意でない多対多の関係を持つために、モデルを自分で定義します

class PostIcon(models.Model):
    post = models.ForeignKey(Post)
    icon = models.ForeignKey(Icon)

それらを1つずつ追加するよりも

for icon in icons:
    PostIcon(post=post, icon=icon).save()

またはそのモデルをegthroughの引数として渡しますManyToManyField

class Post(models.Model):
    icons = models.ManyToManyField(Icon, through=PostIcon)

または、複数の行の代わりにカウントを関連付けることもできます。PostIconたとえば、バッジを 10 回表示したい場合などです。

class PostIcon(models.Model):
    post = models.ForeignKey(Post)
    icon = models.ForeignKey(Icon)
    count =  models.IntegerField()
于 2011-08-31T18:18:51.853 に答える