欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django ORM多對多查詢方法(自定義第三張表&ManyToManyField)

 更新時間:2019年08月09日 10:09:22   作者:Mcdull93  
今天小編就為大家分享一篇Django ORM多對多查詢方法(自定義第三張表&ManyToManyField),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

對于多對多表

- 1.自定義第三張表,更加靈活

- 2.ManyToManyField 自動生成第3張表 只能 有3列數(shù)據(jù) 不能自己添加。

自定義第三張表

# models.py

class Boy(models.Model):
  name = models.CharField(max_length=32)

class Girl(models.Model):
  name = models.CharField(max_length=32)


class Love(models.Model):
  b = models.ForeignKey('Boy')
  g = models.ForeignKey('Girl')

  # 創(chuàng)建聯(lián)合唯一索引
  # class Meta:
  #   unique_together = [
  #     ('b','g'),
  #   ]




# views.py

def test(request):
  # objs = [
  #   models.Boy(name='summer'),
  #   models.Boy(name='spring'),
  #   models.Boy(name='autumn'),
  # ]
  # models.Boy.objects.bulk_create(objs,5)

  # objs = [
  #   models.Girl(name='小于'),
  #   models.Girl(name='小秋'),
  #   models.Girl(name='小夏'),
  # ]
  # models.Girl.objects.bulk_create(objs,5)

# 查詢和girl小于有關(guān)系的boy

# 1 通過girl表進行反向查找
  obj = models.Girl.objects.filter(name='小于').first().love_set.all()
  # obj = models.Girl.objects.filter(name='小于').first().love_set.select_related('b').all()
  for i in obj:
    print(i.b.name)




  print(' '.center(60,'='))



# 2 通過Love表進行查找

  obj = models.Love.objects.filter(g__name='小于').all()
  for i in obj:
    print(i.b.name)

  # 這樣進行查詢性能不好,需要重新發(fā)sql請求在進行查詢另外一張表中的數(shù)據(jù)

  boy_list = models.Love.objects.filter(g__name='小于').values('b__name')
  for i in boy_list:
    print(i['b__name'])

  # 這樣 進行了 優(yōu)化 不會重復(fù)發(fā)送sql請求,查詢到的結(jié)果內(nèi)是字典

  boy_obj = models.Love.objects.filter(g__name='小于').select_related('b').all()
  for i in boy_obj:
    print(i.b.name)
  # select_related('ut') 相當(dāng) 于 inner join 先連成一張表再進行查詢

  return HttpResponse('insert ok ....')


ManyToManyField

# models.py
from django.db import models

class Boy(models.Model):
  name = models.CharField(max_length=32)
  # m = models.ManyToManyField('Girl')

class Girl(models.Model):
  name = models.CharField(max_length=32)
  m = models.ManyToManyField('Boy')

# views.py

def test(request):
  # objs = [
  #   models.Boy(name='summer'),
  #   models.Boy(name='spring'),
  #   models.Boy(name='autumn'),
  # ]
  # models.Boy.objects.bulk_create(objs,5)

  # objs = [
  #   models.Girl(name='小于'),
  #   models.Girl(name='小秋'),
  #   models.Girl(name='小夏'),
  # ]
  # models.Girl.objects.bulk_create(objs,5)


  # ManyToManyField

  obj = models.Girl.objects.filter(name='小秋').first()

  # 增
  # obj.m.add(3)
  # obj.m.add(3,4)
  # obj.m.add(*[1,2])

  # 刪
  # obj.m.remove(3)
  # obj.m.remove(3,4)
  # obj.m.remove(*[1,2])

  # 改
  # obj.m.set([1,2,])

  # boy_obj = obj.m.all()
  # for row in boy_obj:
  #   print(row.id,row.name)
  # 清除
  # obj.m.clear()


  # 反向查 在沒有 ManyToManyField 字段的表中查
  obj = models.Boy.objects.filter(name='summer').first()
  girl_obj = obj.girl_set.all()
  # 增刪改查
  obj.girl_set.set([1,2,3])

  for row in girl_list:
    print(row.id,row.name)

  return HttpResponse('ok')

雜交(自定義第三張表+ManyToManyField)

# modles.py
class Boy(models.Model):
  name = models.CharField(max_length=32)

class Girl(models.Model):
  name = models.CharField(max_length=32)
  m = models.ManyToManyField('Boy',through='Love',through_fields=('b','g')) # 只讓其生成3張表,如果不加后面產(chǎn)生生成4張表

class Love(models.Model):
  b = models.ForeignKey('Boy')
  g = models.ForeignKey('Girl')

# views.py
def test(request):
  obj = models.Girl.objects.filter(name='小于').first()
  # obj.m.add(1) # 不行
  # obj.m.remove(1) # 不行
  # obj.m.set([1,2]) # 不行
  # obj.m.clear() # 可以
  # obj.m.all() # 可以

  # 雜交的方法對獲取查詢方便點,還添加了清空功能

  boy_obj = obj.m.all()

  for i in boy_obj:
    print(i.name)

以上這篇Django ORM多對多查詢方法(自定義第三張表&ManyToManyField)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python數(shù)據(jù)操作之lambda表達式詳情

    python數(shù)據(jù)操作之lambda表達式詳情

    這篇文章主要介紹了python數(shù)據(jù)操作之lambda表達式詳情,文章基于python的相關(guān)資料展開lambda表達式具體的內(nèi)容,感興趣的小伙伴可以參考一下
    2022-05-05
  • Python 腳本獲取ES 存儲容量的實例

    Python 腳本獲取ES 存儲容量的實例

    今天小編就為大家分享一篇Python 腳本獲取ES 存儲容量的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 基于python計算滾動方差(標準差)talib和pd.rolling函數(shù)差異詳解

    基于python計算滾動方差(標準差)talib和pd.rolling函數(shù)差異詳解

    這篇文章主要介紹了基于python計算滾動方差(標準差)talib和pd.rolling函數(shù)差異詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 使用python計算三角形的斜邊例子

    使用python計算三角形的斜邊例子

    這篇文章主要介紹了使用python計算三角形的斜邊例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Pytorch卷積層手動初始化權(quán)值的實例

    Pytorch卷積層手動初始化權(quán)值的實例

    今天小編就為大家分享一篇Pytorch卷積層手動初始化權(quán)值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Django中利用filter與simple_tag為前端自定義函數(shù)的實現(xiàn)方法

    Django中利用filter與simple_tag為前端自定義函數(shù)的實現(xiàn)方法

    這篇文章主要給大家介紹了Django中利用filter與simple_tag為前端自定義函數(shù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • 關(guān)于numpy和torch.tensor的張量的操作

    關(guān)于numpy和torch.tensor的張量的操作

    這篇文章主要介紹了關(guān)于numpy和torch.tensor的張量的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用 Python ssh 遠程登陸服務(wù)器的最佳方案

    使用 Python ssh 遠程登陸服務(wù)器的最佳方案

    這篇文章主要介紹了使用 Python ssh 遠程登陸服務(wù)器的最佳方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python Django 簡單分頁的實現(xiàn)代碼解析

    Python Django 簡單分頁的實現(xiàn)代碼解析

    這篇文章主要介紹了Python Django 簡單分頁的實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python標準庫uuid模塊(生成唯一標識)詳解

    Python標準庫uuid模塊(生成唯一標識)詳解

    uuid通過Python標準庫的uuid模塊生成通用唯一ID(或“UUID”)的一種快速簡便的方法,下面這篇文章主要給大家介紹了關(guān)于Python標準庫uuid模塊(生成唯一標識)?的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論