Python 在Django中绕过多对多关系的唯一约束的最佳方法?

Python 在Django中绕过多对多关系的唯一约束的最佳方法?,python,sql,django,Python,Sql,Django,在这种情况下,我需要能够将同一对象的多个副本添加到多对多关系中 假设问题是记录某人拥有的家具类型。以下是我的基本模型: class Person(models.Model): name = models.CharField(max_length=100) class Furniture(models.Model): furniture_name = models.CharField(max_length=100) #e.g. Chair, Sofa. 假设我想记录下Sam拥有

在这种情况下,我需要能够将同一对象的多个副本添加到多对多关系中

假设问题是记录某人拥有的家具类型。以下是我的基本模型:

class Person(models.Model):
    name = models.CharField(max_length=100)

class Furniture(models.Model):
    furniture_name = models.CharField(max_length=100) #e.g. Chair, Sofa.
假设我想记录下Sam拥有3把椅子和2张沙发。但是我不想在数据库中创建多个
sofa
对象。在多对多关系中,我如何做到这一点?传统的多对多模式有一个独特的约束来防止这种情况

我正在考虑使用一个贯穿表,在惟一约束中使用另一个字段(购买日期,或者只是一个随机字符串)。这样行吗


有人有更好的方法吗?

在这里创建一个直通表是一个很好的方法,因为所有东西都是干燥的,并且非常容易使用:

class Ownership:
    owner = models.ForeignKey(Person, on_delete=models.CASCADE)
    furniture = models.ForeignKey(Furniture, on_delete=models.CASCADE)

    items_owned = models.IntegerField(default=0)

    class Meta:
        unique_together = [
            'owner', 'furniture'
        ]

person = Person.objects.get(name='Bob')
furniture = Furniture.objects.get(furniture_name='Sofa')

# update the number of items owned
Ownership.objects.update_or_create(
    owner=person, furniture=furniture, defaults=dict(items_owned=3))

# get the number of items owned
person.ownership_set.get(furniture=furniture).items_owned

# or for example
Ownership.objects.get(owner__name='Bob', furniture__name='Sofa').items_owned

然后,您可以使用自定义管理器抽象出这个复杂的查询和更新逻辑

您需要的是在透视表上的Person和Furniture之间添加一列。(我不知道Django,但这可以帮助你找到一个有效的答案)好了,谢谢,这是一个非常有用的答案。我特别欣赏如何获取项目的例子。Django表示,未来可能会反对使用
模型。UniqueConstraint
。也许这个答案应该相应地更新