Какие модельные отношения я должен использовать? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть следующее в моем models.py

class items(models.Model):
    name = models.CharField(max_length=255)
    item_image = models.ImageField(upload_to='itemimage/', default=None, blank=True)
    price = models.DecimalField(decimal_places=2, max_digits=100)        

class comparelist(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    item1 = models.ForeignKey(items, on_delete=models.CASCADE, null=True, blank=True)
    item2 = models.ForeignKey(items, on_delete=models.CASCADE, null=True, blank=True)
    item3 = models.ForeignKey(items, on_delete=models.CASCADE, null=True, blank=True)
    item4 = models.ForeignKey(items, on_delete=models.CASCADE, null=True, blank=True)

Идея состоит в том, чтобы позволить пользователю добавить 4 различных элемента в свою учетную запись, чтобы они могли сравнивать их.

Но когда я делаю миграцию, я получаю следующую ошибку:

compareapp.comparelist.item1: (fields.E304) Reverse accessor for 'comparelist.item1' clashes with reverse accessor for 'comparelist.item2'.
        HINT: Add or change a related_name argument to the definition for 'comparelist.item1' or 'comparelist.item2'.

Я предполагаю, что ForeignKey - это не поле отношений, которое нужно здесь использовать. Я пытался читать Django Docs на полях отношений, но я не могу разобраться с этим.

Может ли кто-нибудь дать мне простое объяснение 3-х различных полей отношений? И какой из них следует использовать в этой ситуации?

1 Ответ

2 голосов
/ 30 апреля 2019

Вам следует использовать отношение Многие-ко-многим , поскольку вы хотите, чтобы в вашем списке сравнения было несколько элементов, но вы также, вероятно, хотите, чтобы элементы были в нескольких списках.Чтобы ограничить количество отношений «многие ко многим» в списке, вы можете написать собственный метод добавления новых элементов, например:

class CompareList(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    items = models.ManyToManyField(items, related_name='compare_lists')

    def add_item(self, item):
        if self.items.count() < 4:
            self.items.add(item)
        else:
            raise Exception('List limit reached')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...