Django--ORM多对多表操作

创建用于演示的数据表

models.py:
                        class Boy(models.Model):
                            name = models.CharField(max_length=32, null=True)

                        class Girl(models.Model):
                            nick = models.CharField(max_length=32, null=True)

                        class Love(models.Model):
                            b = models.ForeignKey("Boy", null=True)
                            g = models.ForeignKey("Girl", null=True)

查询boy表中的某个男孩对应的女孩

方法一

# res = models.Boy.objects.filter(name='boy1').first()
# # print(res) 
### Boy object
# ### 反向查询 love中的记录 # love_list = res.love_set.all()
## <QuerySet [<Love: Love object>, <Love: Love object>]>
# for obj in love_list: # ### 正向查询 girl表中的nick # print(obj.g.nick)

方法二

# res = models.Love.objects.filter(b__name='勾洋').all()
# print(res) ## <QuerySet [<Love: Love object>, <Love: Love object>]>
# for obj in res:
#     print(obj.g.nick)

方法三

res = models.Love.objects.filter(b__name='勾洋').values("g__nick")
print(res)

以上的方法是基于我们自己创建的第三张多对多表来讲两个表关联起来来实现正查反查

而在django中我们可以通过 ManyToManyField() 来生成第三张表

在models.py下
class Boy(models.Model):
  name = models.CharField(max_length=32, null=True)
  g = models.ManyToManyField('Girl', null=True)

class Girl(models.Model):
  nick = models.CharField(max_length=32, null=True)

增加

obj = models.Boy.objects.filter(name='boy1').first()
print(obj)
#==>Boy object
obj.g.add(3) obj.g.add(*[1,2])       在关联表中增加两条数据

重置

obj = models.Boy.objects.filter(name='boy1').first()
obj.g.set([4])  清空关联表中所有obj相关的数据然后重新写入列表中的数据

查询

obj = models.Boy.objects.filter(name='boy1').first()
res = obj.g.all()
print(res)
#==》<QuerySet [<Girl: Girl object>, <Girl: Girl object>, <Girl: Girl object>]>
for obj in res: print(obj.nick)

删除  

obj = models.Boy.objects.filter(name='boy1').first()
obj.g.clear()

猜你喜欢

转载自www.cnblogs.com/duGD/p/11203870.html