我有一种情况,我需要能够将同一对象的多个副本添加到多对多关系中。
假设问题是记录某人拥有的家具类型。这是我的基本模型:
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
在数据库中创建多个对象。我怎样才能用多对多关系做到这一点?传统的多对多有一个独特的约束来防止这种情况。
我正在考虑使用一个直通表,在唯一约束中使用另一个字段(购买日期,或者只是一个随机字符串)。那行得通吗?
有没有人有更好的方法来做到这一点?
创建一个直通表在这里是一个很好的方法,因为一切都将是 DRY 并且非常易于使用:
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
然后,您可以使用自定义管理器将这种复杂的查询和更新逻辑抽象出来https://docs.djangoproject.com/en/2.0/topics/db/managers/#custom-managers
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句