经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
来源:jb51  时间:2019/8/9 10:31:34  对本文有异议

对于多对多表

- 1.自定义第三张表,更加灵活

- 2.ManyToManyField 自动生成第3张表 只能 有3列数据 不能自己添加。

自定义第三张表

  1. # models.py
  2.  
  3. class Boy(models.Model):
  4. name = models.CharField(max_length=32)
  5.  
  6. class Girl(models.Model):
  7. name = models.CharField(max_length=32)
  8.  
  9.  
  10. class Love(models.Model):
  11. b = models.ForeignKey('Boy')
  12. g = models.ForeignKey('Girl')
  13.  
  14. # 创建联合唯一索引
  15. # class Meta:
  16. # unique_together = [
  17. # ('b','g'),
  18. # ]
  19.  
  20.  
  21.  
  22.  
  23. # views.py
  24.  
  25. def test(request):
  26. # objs = [
  27. # models.Boy(name='summer'),
  28. # models.Boy(name='spring'),
  29. # models.Boy(name='autumn'),
  30. # ]
  31. # models.Boy.objects.bulk_create(objs,5)
  32.  
  33. # objs = [
  34. # models.Girl(name='小于'),
  35. # models.Girl(name='小秋'),
  36. # models.Girl(name='小夏'),
  37. # ]
  38. # models.Girl.objects.bulk_create(objs,5)
  39.  
  40. # 查询和girl小于有关系的boy
  41.  
  42. # 1 通过girl表进行反向查找
  43. obj = models.Girl.objects.filter(name='小于').first().love_set.all()
  44. # obj = models.Girl.objects.filter(name='小于').first().love_set.select_related('b').all()
  45. for i in obj:
  46. print(i.b.name)
  47.  
  48.  
  49.  
  50.  
  51. print(' '.center(60,'='))
  52.  
  53.  
  54.  
  55. # 2 通过Love表进行查找
  56.  
  57. obj = models.Love.objects.filter(g__name='小于').all()
  58. for i in obj:
  59. print(i.b.name)
  60.  
  61. # 这样进行查询性能不好,需要重新发sql请求在进行查询另外一张表中的数据
  62.  
  63. boy_list = models.Love.objects.filter(g__name='小于').values('b__name')
  64. for i in boy_list:
  65. print(i['b__name'])
  66.  
  67. # 这样 进行了 优化 不会重复发送sql请求,查询到的结果内是字典
  68.  
  69. boy_obj = models.Love.objects.filter(g__name='小于').select_related('b').all()
  70. for i in boy_obj:
  71. print(i.b.name)
  72. # select_related('ut') 相当 于 inner join 先连成一张表再进行查询
  73.  
  74. return HttpResponse('insert ok ....')
  75.  
  76.  

ManyToManyField

  1. # models.py
  2. from django.db import models
  3.  
  4. class Boy(models.Model):
  5. name = models.CharField(max_length=32)
  6. # m = models.ManyToManyField('Girl')
  7.  
  8. class Girl(models.Model):
  9. name = models.CharField(max_length=32)
  10. m = models.ManyToManyField('Boy')
  11.  
  12. # views.py
  13.  
  14. def test(request):
  15. # objs = [
  16. # models.Boy(name='summer'),
  17. # models.Boy(name='spring'),
  18. # models.Boy(name='autumn'),
  19. # ]
  20. # models.Boy.objects.bulk_create(objs,5)
  21.  
  22. # objs = [
  23. # models.Girl(name='小于'),
  24. # models.Girl(name='小秋'),
  25. # models.Girl(name='小夏'),
  26. # ]
  27. # models.Girl.objects.bulk_create(objs,5)
  28.  
  29.  
  30. # ManyToManyField
  31.  
  32. obj = models.Girl.objects.filter(name='小秋').first()
  33.  
  34. # 增
  35. # obj.m.add(3)
  36. # obj.m.add(3,4)
  37. # obj.m.add(*[1,2])
  38.  
  39. # 删
  40. # obj.m.remove(3)
  41. # obj.m.remove(3,4)
  42. # obj.m.remove(*[1,2])
  43.  
  44. # 改
  45. # obj.m.set([1,2,])
  46.  
  47. # boy_obj = obj.m.all()
  48. # for row in boy_obj:
  49. # print(row.id,row.name)
  50. # 清除
  51. # obj.m.clear()
  52.  
  53.  
  54. # 反向查 在没有 ManyToManyField 字段的表中查
  55. obj = models.Boy.objects.filter(name='summer').first()
  56. girl_obj = obj.girl_set.all()
  57. # 增删改查
  58. obj.girl_set.set([1,2,3])
  59.  
  60. for row in girl_list:
  61. print(row.id,row.name)
  62.  
  63. return HttpResponse('ok')

杂交(自定义第三张表+ManyToManyField)

  1. # modles.py
  2. class Boy(models.Model):
  3. name = models.CharField(max_length=32)
  4.  
  5. class Girl(models.Model):
  6. name = models.CharField(max_length=32)
  7. m = models.ManyToManyField('Boy',through='Love',through_fields=('b','g')) # 只让其生成3张表,如果不加后面产生生成4张表
  8.  
  9. class Love(models.Model):
  10. b = models.ForeignKey('Boy')
  11. g = models.ForeignKey('Girl')
  12.  
  13. # views.py
  14. def test(request):
  15. obj = models.Girl.objects.filter(name='小于').first()
  16. # obj.m.add(1) # 不行
  17. # obj.m.remove(1) # 不行
  18. # obj.m.set([1,2]) # 不行
  19. # obj.m.clear() # 可以
  20. # obj.m.all() # 可以
  21.  
  22. # 杂交的方法对获取查询方便点,还添加了清空功能
  23.  
  24. boy_obj = obj.m.all()
  25.  
  26. for i in boy_obj:
  27. print(i.name)

以上这篇Django ORM多对多查询方法(自定义第三张表&ManyToManyField)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号