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
。也许这个答案应该相应地更新