解决 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 拥有 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

解决多对多关系时 django Prefetch() 的字段错误

来自分类Dev

解决多对多关系

来自分类Dev

Django中的多对多关系

来自分类Dev

Python / Django多租户解决方案

来自分类Dev

Django中的.add()方法未添加的多对多关系条目

来自分类Dev

Django中的ModuleNotFound错误。无法解决错误

来自分类Dev

django 中未解决的导入“博客”

来自分类Dev

Django 多对多关系

来自分类Dev

Django中多租户的最佳解决方案是什么?

来自分类Dev

在Django模型中订购多对多关系

来自分类Dev

Django中与模型继承的多对多关系

来自分类Dev

在Django模型中订购多对多关系

来自分类Dev

在 Django 中嵌套多对多关系

来自分类Dev

解决RPG游戏中的多对多关系

来自分类Dev

Django帮助:使用CreateView解决NOT NULL约束失败的错误

来自分类Dev

如何解决或修复Django循环模型字段依赖关系?

来自分类Dev

如何使用2个级别解决Django ManyToMany关系

来自分类Dev

Django未实现解决

来自分类Dev

与Django,Python的多对多关系

来自分类Dev

Django中二维数组的解决方法

来自分类Dev

Django中的Fabric。如何解决等待SSH完成的视图

来自分类Dev

如何解决Django(1.4.2)中的以下错误

来自分类Dev

如何解决python django中的此错误?

来自分类Dev

如何解决Django测试中的内存泄漏?

来自分类Dev

如何解决ajax django中的JSONdecode错误?

来自分类Dev

如何解决Django中的404错误图片

来自分类Dev

如何解决Django中找不到页面的错误?

来自分类Dev

如何解决Django中的Value Error Assign错误?

来自分类Dev

如何解决Django(1.4.2)中的以下错误