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

У меня есть следующая модель 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 Ответ

8 голосов
/ 31 августа 2011

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

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()
...