我应该使用哪种模型关系?

时间:2019-04-29 22:23:10

标签: django

我的模型中有以下内容。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文档,但我对此一无所知。

有人可以给我关于3个不同关系字段的简单解释吗?在这种情况下应该使用哪一个?

1 个答案:

答案 0 :(得分:2)

您应该使用Many-to-many关系,因为您希望比较列表中有多个项目,但是您可能还希望这些项目位于多个列表中。要限制列表具有的多对多关系,您可以编写一个自定义方法来添加新项目,例如:

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