Способ учесть дублирование записей многие-ко-многим в Python/Django

У меня есть следующая модель 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 и два объекта Icon.

Однако, если icon_id, скажем, 1 в обоих случаях, он создает только одну запись в базе данных, а не две.

Похоже, что он проверяет дубликаты и удаляет их.

Как сделать так, чтобы я разрешал дубликаты? (Я хочу, чтобы два из ЖЕ значка, связанного с сообщением.)

Спасибо!

1 ответ

Решение

Определите модель самостоятельно, чтобы иметь такие неуникальные отношения "многие ко многим"

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

и чем добавить их по одному

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

или передать эту модель как through аргумент 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()
Другие вопросы по тегам