Django 數據庫查詢集合(雙下划線連表操作)


 Django是一款優秀的web框架,有着自己的ORM數據庫模型。在項目中一直使用django數據庫,寫一篇文章專門記錄一下數據庫操作。略寫django工程創建過程,詳寫查詢過程。可以和sqlalchemy對比來看,會發現有很多相同的地方,例如外鍵,外鍵關聯關系等。上一篇sqlalchemy查詢文章

目錄:

1.Django環境搭建

2.數據庫建表

3.寫入數據

4.查詢語句

Django環境搭建

1.安裝django

pip install django

 

2.創建工程

django.admin project myself

 

3.創建app

python manage.py create sql_train

 

4.設置setting文件

將應用sql_train加入到app中

修改數據庫連接方式

將默認的sqlite3數據庫修改成mysql數據庫

如果沒有安裝過mysql數據庫,先安裝mysql,然后安裝mysqldb驅動

 

添加url映射

 

2 創建表結構

 

from __future__ import unicode_literals

from django.db import models

class Student(models.Model):
     id = models.IntegerField(primary_key=True)
     name = models.CharField(max_length=20)

class Family(models.Model):
    id = models.IntegerField(primary_key=True)
    member = models.CharField(max_length=20)
    stu_id = models.ForeignKey(Student,related_name='student')

class House(models.Model):
    id = models.IntegerField(primary_key=True)
    location = models.CharField(max_length=100)
    family_id = models.ForeignKey(Family,related_name='family')


class Cars(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    Family = models.ForeignKey(Family,related_name='family_to_car')

 

表結構:

Student是主表

Family是從表,有一個外鍵stu_id連接到Student

House是Family的從表 有一個外鍵family_id連接到Family

Cars是Family的從表,有一個外鍵Family連接到Family

 

在應用sql_train中的models.py中創建四張表結構,分別是:Student,Family,House,Cars。使用如下命令將表結構創建在mysql數據庫中

python manage.py migrate

 

寫入數據

 

#coding:utf-8

from django.shortcuts import render
from django.http import HttpResponse
from models import Student,Family,House,Cars
from django.db import models
from django.db.models import Q

def sql(request):

    create_value()
    #select_compex()

    return HttpResponse('hello')


def create_value(): # Student.objects.create(id
=1,name='悟空') # Student.objects.create(id=2,name='貝吉塔') # Student.objects.create(id=3,name='比克') # Student.objects.create(id=4,name='天津飯') # Student.objects.create(id=6,name='庫林') # Student.objects.create(id=7,name='18號') # Student.objects.create(id=8,name='餃子') # Family.objects.create(id=1,member=4,stu_id=Student.objects.get(id=1)) # Family.objects.create(id=2,member=6,stu_id=Student.objects.get(id=2)) # Family.objects.create(id=3,member=9,stu_id=Student.objects.get(id=3)) # Family.objects.create(id=4,member=5,stu_id=Student.objects.get(id=4)) # House.objects.create(id=1,location='地球',family_id=Family.objects.get(id=1)) # House.objects.create(id=2,location='貝吉塔星',family_id=Family.objects.get(id=2)) # House.objects.create(id=3,location='那美克星',family_id=Family.objects.get(id=3)) # House.objects.create(id=4,location='地球',family_id=Family.objects.get(id=4)) Cars.objects.create(id=1,name='筋斗雲',Family=Family.objects.get(id=1)) Cars.objects.create(id=2,name='引力',Family=Family.objects.get(id=2)) Cars.objects.create(id=3,name='意念',Family=Family.objects.get(id=3)) Cars.objects.create(id=4,name='翅膀',Family=Family.objects.get(id=4))

 

有外鍵關聯的數據,插入數據時是插入整個外鍵的對象。例如:Family的外鍵關聯到Student,Family表中的stu_id要填入對應的Student的對象。

 

查詢語句

 

def select_compex(): 
#普通查詢語句 # result_one
= Student.objects.all() #過濾 # result_two = House.objects.filter(id=3) #related_name,外鍵字段使用 #通過Student查詢到Family的數據 # result_three = Student.objects.get(id=2) # result_four = result_three.student.all() # result_three = Student.objects.get(id=2) # result_four = result_three.student.all()
django數據庫雙下划線操作。
django數據庫中沒有連表的操作,沒有sqlalchemy中的join操作,它使用了一種更簡潔的操作‘__’ ,雙下划線。
使用雙下划線可以完成連表操作,可以正向查詢,也可以反向查詢。

# Student <----- Family <------ House
|
|----------- Cars

    #正向查詢一層
#查詢Family表,約束條件是Student表中的姓名是 ‘悟空’ # result_seven = Family.objects.filter(stu_id__name='悟空')
#正向查詢兩層
#查詢House表,約束條件是Student表中的name是 悟空
# result_eight = House.objects.filter(family_id__stu_id__name='悟空')

#反向查詢一層
#查詢Student表,約束關系是Family表中的 id 是 1 # result_five
= Student.objects.filter(student__id=1) # for x in result_five: # print x.id,x.name
#反向查詢兩層
#查詢student表,約束關系是House表中的 id 是 3
# Student <----- Family <------ House
# 兩個技巧,一、反向查詢 二、兩層操作 # result_six
= Student.objects.filter(student__family__id=3) # for x in result_six: # print x.id,x.name '''


#正反向混合查詢
House表和Car表的外鍵同時指定到Family;查詢House表,約束條件是car表中的name字段為 筋斗雲
# result_fiveteen = House.objects.filter(family_id__family_to_car__name='筋斗雲')


# result_six = Student.objects.filter(id=3) # result_eight = Student.objects.get(id=3) # result_nine = Student.objects.all() #and和or查詢 #and查詢
#與查詢,並列查詢,直接將條件全部都寫在查詢括號中就可 # result_ten
= House.objects.filter(location='地球',id=1) #or查詢
#django的查詢語句的或運算沒有sqlalchemy中的or關鍵字,這里是使用了關鍵字Q,使用Q將查詢語句包裹,然后使用 | 連接,完成或查詢。 # result_eleven
= House.objects.filter(Q(location='地球')|Q(id=1)) #or查詢 # result_twenty = House.objects.filter(Q(location='地球')|Q(id=1)|Q(id=3)) #排除字段 #exclude不等於,即排除這個條件其他都查詢出來。例如:查詢Family中id不等於1的 # result_thirteen = Family.objects.exclude(id=1) #offset和limit #Django中沒有sqlalchemy里切片的關鍵字offset和limit。可以直接使用類似python中切片的操作[]。 # result_foutteen = Student.objects.all()[2:4] #精確查詢 #exact精確匹配,區分大小寫 #iexact精確匹配,不區分大小寫 result_sixteen = Student.objects.filter(name__iexact='') #模糊查詢 #contains模糊查詢碼,區分大小寫 #icontains模糊查詢,不區分大小寫 result_seventeen = Student.objects.filter(name__contains='K') result_seventeen = Student.objects.filter(name__contains='K')



filter和all查詢出來都是列表,QuerySet類型的數據。QuerySet是一個可遍歷結構,包含一個或多個元素,每個元素都是一個Model 實例 QuerySet類似於Python中的list
get查詢出來是對象。
for x in result_seventeen: print x.id,x.name print '查詢長度' print result_seventeen.count()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM