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=) class Family(models.Model):
id = models.IntegerField(primary_key=True)
member = models.CharField(max_length=)
stu_id = models.ForeignKey(Student,related_name='student') class House(models.Model):
id = models.IntegerField(primary_key=True)
location = models.CharField(max_length=)
family_id = models.ForeignKey(Family,related_name='family') class Cars(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=)
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=,name='悟空')
# Student.objects.create(id=,name='贝吉塔')
# Student.objects.create(id=,name='比克')
# Student.objects.create(id=,name='天津饭') # Student.objects.create(id=,name='库林')
# Student.objects.create(id=,name='18号')
# Student.objects.create(id=,name='饺子') # Family.objects.create(id=,member=,stu_id=Student.objects.get(id=))
# Family.objects.create(id=,member=,stu_id=Student.objects.get(id=))
# Family.objects.create(id=,member=,stu_id=Student.objects.get(id=))
# Family.objects.create(id=,member=,stu_id=Student.objects.get(id=)) # House.objects.create(id=,location='地球',family_id=Family.objects.get(id=))
# House.objects.create(id=,location='贝吉塔星',family_id=Family.objects.get(id=))
# House.objects.create(id=,location='那美克星',family_id=Family.objects.get(id=))
# House.objects.create(id=,location='地球',family_id=Family.objects.get(id=)) Cars.objects.create(id=,name='筋斗云',Family=Family.objects.get(id=))
Cars.objects.create(id=,name='引力',Family=Family.objects.get(id=))
Cars.objects.create(id=,name='意念',Family=Family.objects.get(id=))
Cars.objects.create(id=,name='翅膀',Family=Family.objects.get(id=))

有外键关联的数据,插入数据时是插入整个外键的对象。例如:Family的外键关联到Student,Family表中的stu_id要填入对应的Student的对象。

查询语句

def select_compex():

#普通查询语句
# result_one = Student.objects.all() #过滤
# result_two = House.objects.filter(id=) #related_name,外键字段使用
#通过Student查询到Family的数据
# result_three = Student.objects.get(id=)
# result_four = result_three.student.all() # result_three = Student.objects.get(id=)
# 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=)
# 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=)
# 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=)
# result_eight = Student.objects.get(id=)
# result_nine = Student.objects.all() #and和or查询 #and查询
#与查询,并列查询,直接将条件全部都写在查询括号中就可
# result_ten = House.objects.filter(location='地球',id=) #or查询
#django的查询语句的或运算没有sqlalchemy中的or关键字,这里是使用了关键字Q,使用Q将查询语句包裹,然后使用 | 连接,完成或查询。
# result_eleven = House.objects.filter(Q(location='地球')|Q(id=)) #or查询
# result_twenty = House.objects.filter(Q(location='地球')|Q(id=)|Q(id=)) #排除字段
#exclude不等于,即排除这个条件其他都查询出来。例如:查询Family中id不等于1的
# result_thirteen = Family.objects.exclude(id=) #offset和limit
#Django中没有sqlalchemy里切片的关键字offset和limit。可以直接使用类似python中切片的操作[]。
# result_foutteen = Student.objects.all()[:] #精确查询
#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()

Django 数据库查询集合(双下划线连表操作)的更多相关文章

  1. Django 数据库查询集合(多对多)

    Django 数据库查询集合(双下划线连表操作) 目录: 1.Django环境搭建 2.数据库建表 3.写入数据 4.查询语句 Django环境搭建 1.安装django pip install dj ...

  2. Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...

  3. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  4. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  5. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

  6. Django day08 多表操作 (三) 基于对象的跨表查询 基于双下划线的多表查询

    一: 基于对象的跨表查询 1. 一对一 正向: 反向: 2. 一对多 正向: 反向: 3.多对多 正向: 反向: 4.*****基于对象的多表查询 二: 基于双下划线的多表查询 1. 连表查询 一对一 ...

  7. orm多表查询基于双下划线

    ###########基于双下划线的跨表查询(基于join实现的)############# key: 正向查询按字段,反向查询按表名小写 1.查询python这本书出版社的名字 ret = Book ...

  8. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  9. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

    在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...

随机推荐

  1. LeetCode算法题-Construct String from Binary Tree(Java实现)

    这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...

  2. Jenkins插件之显示构建时间

    1.进入jenkin插件管理器中,安装  Timestamper 插件 2.安装完成后,进入到构建任务里面,在 构建环境 中勾选  Add timestamps to the Console Outp ...

  3. linux环境下快速安装Mariadb和Redis

    一 Mariadb(Mysql)篇 1.新建一个yum源仓库 touch /etc/yum.repos.d/Mariadb.repo 2.在这个yum源仓库文件中,添加仓库url地址 [mariadb ...

  4. spring注解驱动--组件注册

    为容器中注册Bean @Configuration代表该类是一个配置类,配置类起到的作用和xml配置文件一样 @Bean代表该方法的返回对象作为Bean加入IOC容器,默认Bean的id是方法的名称. ...

  5. MyIASM和Innodb引擎详解

    MyIASM 和 Innodb引擎详解 Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级 ...

  6. Shiro学习(一)——Shiro简介

    Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...

  7. c# winform 多屏显示

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  8. Vue slot插槽内容分发

    slot插槽使用 使用场景,一般父组件中又一大段模板内容需要运用到子组件上.或者更加复杂的,子组件需要运用到父组件大段模板内容,而子组件却不知道挂载的内容是什么.挂载点的内容是由父组件来决定的. Sl ...

  9. C#中字符串的字面值(转义序列)

    在程序开发中,经常会碰到在字符串中字面值中使用转义序列,下面表格收集了下转义序列的完整列表,以便大家查看引用: 转义序列列表 转义序列 产生的字符 字符的Unicode值 \' 单引号 0x0027 ...

  10. 映美FP-530K+打印发票卡纸

    最近打发票卡纸了几次,只能作废掉,硬件不太好排查,卡纸都是在发票的中间位置,我在卡纸的时候观察了好几次,打开打印机盖子,直接裸露这样看里面的打印状况,目前发现了两种卡纸位置. 如图,一种是后面的黑色塑 ...