1. 程式人生 > >django-一對一、一對多、多對多操作、常用方法

django-一對一、一對多、多對多操作、常用方法

準備表

建立如下幾張表

from django.shortcuts import HttpResponse, render, redirect
from django.db import models


class Class(models.Model):
    id = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=32)
    cdata = models.DateField()

    def
__str__(self):
return "%s" % [self.__class__, self.cname] class Student(models.Model): id = models.AutoField(primary_key=True) sname = models.CharField(max_length=32) # 一對多 # cid = models.ForeignKey(to="Class",to_field="id",related_name="student") cid = models.ForeignKey(to="Class"
, to_field="id") # 一對一 detail = models.OneToOneField("StudentDetail", to_field="id") # 等同於如下的程式碼 # detail = models.ForeignKey(to="StudentDetail",to_field="id",unique=True) def __str__(self): return "%s" % [self.sname] # #建立多對多 第一種方法 # class Teacher(models.Model): # id = models.AutoField(primary_key=True)
# tname = models.CharField(max_length=32) # # # class Teacher2Class(models.Model):m # id = models.AutoField(primary_key=True) # tid = models.ForeignKey(to="Teacher",to_field="id") # cid = models.ForeignKey(to="Class",to_field="id") # # class Meta: # unique_together = ("tid","cid") # 建立多對多 第二種方法 class Teacher(models.Model): id = models.AutoField(primary_key=True) tname = models.CharField(max_length=32) cid = models.ManyToManyField(to="Class",name="teacher") # 建立多對多 第3種方法 # class Teacher(models.Model): # id = models.AutoField(primary_key=True) # tname = models.CharField(max_length=32) # cid_tid = models.ManyToManyField(to="Class", # through="Teacher2Class", # through_fields=("tid", "cid")) # # class Teacher2Class(models.Model): # id = models.AutoField(primary_key=True) # tid = models.ForeignKey(to="Teacher", to_field="id") # cid = models.ForeignKey(to="Class", to_field="id") # # class Meta: # unique_together = ("tid", "cid") class StudentDetail(models.Model): id = models.AutoField(primary_key=True) height = models.PositiveIntegerField() email = models.EmailField() memo = models.CharField(max_length=128)

需要注意的如下:

  # 一對多
    # cid = models.ForeignKey(to="Class",to_field="id",related_name="student")
    cid = models.ForeignKey(to="Class", to_field="id")

    # 一對一
    detail = models.OneToOneField("StudentDetail", to_field="id")
    # 等同於如下的程式碼
    # detail = models.ForeignKey(to="StudentDetail",to_field="id",unique=True)

來看下幾個表的表名、欄位名
app01_class班級表:
這裡寫圖片描述

app01_student學生表:
這裡寫圖片描述

app01_studentdetail學生資訊表:
這裡寫圖片描述

app01_class老師表:
這裡寫圖片描述

app01_teacher2class班級老師表:
這裡寫圖片描述

以上的app01_teacher2class表是通過第3種方法建立的,我們來看下第一種、第二方法建立的表名、欄位名是怎樣的?

通過方法1 建立班級-老師對應表如下:
這裡寫圖片描述

通過方法2 建立班級-老師對應表如下:

這裡寫圖片描述

一對一操作

正向查詢(由學生資訊表查詢學生詳情表)

stu = models.Student.objects.first()
stu.detail.email
'[email protected]'

反向查詢(由學生詳情表反向查詢學生資訊表)

detail = models.StudentDetail.objects.get(id=1)
detail.student.sname
'小一

一對多操作

正向查詢(由學生表查詢班級表)

from app01 import models
stu = models.Student.objects.first()
stu.cid_id
1
stu.cid.cname
'全棧1期'

反向查詢(由班級表查詢學生表)

cls = models.Class.objects.first()
cls.student_set.all()
<QuerySet [<Student: ['小一']>, <Student: ['小二']>]>

注意:

如果不在外來鍵的欄位中設定related_name的話,預設就用表名_set。
如果設定了related_name=”students”,反向查詢時可直接使用students進行反向查詢。

cls.students.all() 

多對多操作

正向查詢(由老師表查詢班級表)

from app01 import models
tea = models.Teacher.objects.first()
tea.cid_tid
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x05C110F0>

tea.cid_tid.all()
<QuerySet [<Class: [<class 'app01.models.Class'>, '全棧1期']>, <Class: [<class 'app01.models.Class'>, '全棧2期']>]>

first = tea.cid_tid.first()
first
<Class: [<class 'app01.models.Class'>, '全棧1期']>

first.cname
'全棧1期'

first.student_set
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x03283870>

first.student_set.all()
<QuerySet [<Student: ['小一']>, <Student: ['小二']>]>

反向查詢(由班級表反向查詢老師表)

cls = models.Class.objects.first()
cls.student_set
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x03283070>

cls.teacher_set
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x03224710>

cls.teacher_set.all()
<QuerySet [<Teacher: Teacher object>, <Teacher: Teacher object>]>

cls.teacher_set.all().first()
<Teacher: Teacher object>

cls.teacher_set.all().first().cid_tid
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x032A2790>

cls.teacher_set.all().first().tname
'王老師'

常用方法

create()

from app01 import models
import datetime
teacher = models.Teacher.objects.get(id=1)
teacher.cid.create(cname="linux2",cdata=datetime.datetime.now())
<Class: [<class 'app01.models.Class'>, 'linux2']>

多對對

cls = models.Class.objects.get(id=1)
cls.teacher_set.create(tname="egon")
<Teacher: Teacher object>
import datetime
cls = models.Class.objects.first()
cls.student_set.create(sname="王七",detail_id=4)
stu = models.Student.objects.create(sname="wyf",detail_id=5,cid_id=2)

以下方式對多對多不行!!
這裡寫圖片描述

add()

from app01 import models
import datetime
cls = models.Class.objects.all()
models.Teacher.objects.first().cid.add(*cls)

set\remove\clear

tea = models.Teacher.objects.first()
tea.cid.set([4,3])
tea.cid.remove(3)
tea.cid.clear()

了不起的雙下劃線

這裡寫圖片描述

models.Class.objects.filter(student__sname__contains="d")
<QuerySet [<Class: [<class 'app01.models.Class'>, 'python']>, <Class: [<class 'app01.models.Class'>, 'sfsdf']>]>
models.Class.objects.values("cname")
<QuerySet [{'cname': 'linux'}, {'cname': 'python'}, {'cname': 'sfsdf'}]>

models.Class.objects.values("cname","student__sname")
<QuerySet [{'cname': 'linux', 'student__sname': 'wyf'}, {'cname': 'python', 'student__sname': 'wfdsd'}, {'cname': 'sfsdf', 'student__sname': 'fdgerter'}]>

以下方法不可行!!

models.Class.objects.first().values("cname","student__sname")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'Class' object has no attribute 'values'
models.Class.objects.all().values("cname","student__detail__email")

<QuerySet [{'cname': 'linux', 'student__detail__email': '[email protected]'}, {'cname': 'python', 'student__detail__email': '[email protected]'}, {'cname': 'sfsdf', 'student__detail__email': '[email protected]'}, {'cname': 'linux', 'student__detail__email': '[email protected]'}]>

相關推薦

Django 一對一一對 操作常用方法

幾對幾的模型結構的使用場景為:一般根據業務需求,同一業務,需要向相關聯的多表插入刪除資料時,會用到。 一對一: 建立一個使用者表 class Users(models.Model):   username = models.CharField(max_length=20,null=true,blank

django一對一一對

一對一:A表從B表中選出一條資料一一對應,母表中選出來一條就少一條,子表不可以再選擇母表中已被選擇的那條資料 一對多:A表從B表中選出一條資料一一對應,但母表的這條資料還可以被其他子表資料選擇 多對多:對於A表與B表雙向均是可以有多個選擇 外來鍵:將A表與B表關聯起來。 from dja

JavaScript的函式(定義與解析匿名函式函式傳參return關鍵字)和陣列(操作資料的方法維陣列陣列去重)

函式 函式就是重複執行的程式碼片。 1、函式定義與執行 <script type="text/javascript"> // 函式定義 function aa(){ alert('hello!'); } // 函式執行

資料庫表關聯關係

資料庫多表關聯對多對關係 本文章解決資料庫設計多表關聯配置問題,多對多關係! 設計思路: 應用場景: 1,區域表(欄位:id(城市id)、name(城市名字)) 表名:pms_region 2,中間表(欄位:shipping_area_id、re

selenium瀏覽器操作滑鼠操作等總結

1 控制瀏覽器 Selenium 主要提供的是操作頁面上各種元素的方法,但它也提供了操作瀏覽器本身的方法,比如瀏覽器的大小以及瀏覽器後退、前進按鈕等。 1.1 控制瀏覽器視窗大小 在不同的瀏覽器大小下訪問測試站點,對測試頁面截圖並儲存,然後觀察或使用影象比對工具對被測頁面的前端樣式進行評測。比如可以

android 玩轉ContentProvider之二--實現個ContentProvider張表進行操作

本人原創作品,謝絕轉載!     其它地方跟一個ContentProvider操作一張表都是一樣的,唯一區別是authority,在宣告的時候要注意,因為要宣告兩個ContentProvider,所以authority也要不一樣,否則就會因為找不到對應的ContentPr

初識線程之基礎知識與常用方法

splay 線程與進程 -- 實現 class png sleep .com code 1.線程與進程的描述: 1.1進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1~n個線程。(進程是資源分配的最小單位)   1.2線程:

JQuery:DOM操作屬性操作CSS操作常用方法

ndt mar dom pin disable cli top .text acea DOM操作 1.append在div1的內部最後追加一個圖片   $("#div1").append("<img src=‘........‘/>"); 2.appendTo把

iOS開發基礎:OC數組象NSArray的常用方法

indexof c語言 super main sset spa -- arr 初始 本文介紹了OC的數組對象的基本方法的使用: 因為OC的數組中存儲的為對象類型,所以我們可以新建一個Person類,通過Person生成對象進行操作。 其中Person.h中的代碼為: [o

Java面向象-- String 類 常用方法及基本使用

for str news http clas substr 實例 div print 首先來學習基本使用Jdk api chm文檔: 點擊 左上角-顯示: 1, char chartAt(int index) 返回指定索引處的char值 這裏的index 是從0

java時間操作常用總結

1:java的時間比較String s1="2008-01-25 09:12:09";String s2="2008-01-29 09:12:11";java.text.DateFormat df=new java.text.SimpleDateFormat("yyyy-M

django-一對一一對操作常用方法

準備表 一對一操作 一對多操作 多對多操作 常用方法 準備表 建立如下幾張表 from django.shortcuts import HttpResponse, render, redirect from django.

java-mybaits-00502-案例-映射分析-一對一一對

per username nfa view 2.3 puts opened org double 1、一對一查詢【類屬性即可,association 】 案例:查詢所有訂單信息,關聯查詢下單用戶信息。 註意:因為一個訂單信息只會是一個人下的訂單,所以從查詢

mybatis3.2.7應用_高級映射(一對一一對)

mybatis3 單個 所有 由於 單表 myba 用戶 記錄 text 1. 一對一查詢 需求:查詢訂單信息,關聯查詢創建訂單的用戶信息 1.1 使用resultType實現 1.1.1 sql語句    確定查詢的主表:訂單表   確定查詢的關聯表:用戶表

mybatis 詳解(七)------一對一一對

不變 角色 導入 ctu transacti stat 工程 build -1   前面幾篇博客我們用mybatis能對單表進行增刪改查操作了,也能用動態SQL書寫比較復雜的sql語句。但是在實際開發中,我們做項目不可能只是單表操作,往往會涉及到多張表之間的關聯操作。那麽我

mybatis 一對一一對

bigint into rem http depend path spa records 數據庫表 本項目是 框架架構是 springboot+mybatis 添加maven依賴 <dependency> <groupId>org.mybat

數據表對應關系(一對一一對

結果 ng- 垂直切分 包含 varchar 商品 記錄 padding borde ? 前言 本文主要介紹數據表的關聯關系,這是數據庫設計的常見問題之一。一個好的表結構設計,可以減少一些不必要的表或字段等。數據表之間的關聯關系分為三種:一對一、一對多、多對多。下面就逐一

spring data jpa關聯查詢(一對一一對

sse eager save net array ota println ack generate   在實際過往的項目中,常用的查詢操作有:1、單表查詢,2、一對一查詢(主表和詳情表)3、一對多查詢(一張主表,多張子表)4、多對多查詢(如權限控制,用戶、角色多對多)。做個

使用GreenDao建立表關聯表(一對一一對CURD升級資料庫等操作

        應用場景:從照片中找出包含有使用者人臉的照片,並儲存該照片中的人臉特徵、使用該特徵和使用者人臉特徵對比,滿足條件,照片就儲存到該使用者表裡 一、建立表 GreenDao託管地址:https://github.com/greenrobot

【轉】資料庫一對一一對關係

轉自:https://blog.csdn.net/u013144287/article/details/79024130  本來資料庫一對一、一對多、多對多關係並不複雜,但是最近在理解的時候感覺又感覺多了寫新意,所以現在在來總結一下吧 一、首先給出三種關係的例項 1、一對一關係例項 &