Django基础--数据库操作

Django中的模型(model)本质是数据库中的表(table),当作为开发者时,总会涉及到数据库的操作,而Django中也提供了一些函数,实现sql语句中的增删改查:

惯例,先看模型:

 1 # coding:utf-8
 2 import django.utils.timezone as timezone
 3 from django.db import models
 4 from blast_service.models import DiskInfo
 5 # Create your models here.
 6 class GenomicsFileInfo(models.Model):
 7     COMPUTE_STATE = (
 8          (0, ‘computing‘),
 9          (1, ‘computed‘),
10          (2, ‘idle‘),
11     )
12     ACHIVE_STATUS = (
13         (0, ‘Not archive‘),
14         (1, ‘Archive failed‘),
15         (2, ‘Archive success‘),
16         (3, ‘Ignore‘),
17         (4, ‘Archiving‘)
18     )
19
20     SEND_STATUS = (
21         (0, ‘idle‘),
22         (1, ‘sended‘),
23     )
24     userid = models.CharField(max_length=32,blank=True)
25     cluster_account = models.CharField(max_length=32)
26     filename = models.CharField(max_length=100)
27     md5 = models.CharField(max_length=32, blank=True)
28     file_path = models.CharField(max_length=500)
29     #updatetime = models.DateTimeField(auto_now_add=True)
30     diskinfo = models.ForeignKey(DiskInfo)
31     size = models.BigIntegerField(blank=True)
32     compute_state = models.IntegerField(choices=COMPUTE_STATE, default=2)
33     achive_status = models.IntegerField(choices=ACHIVE_STATUS, default=0)
34     achive_path = models.CharField(max_length=500, blank=True)
35     updatetime = models.DateTimeField(default = timezone.now)
36     is_deleted = models.BooleanField(default=False, verbose_name=u‘delete tag‘)
37     class Meta:
38         unique_together = (‘cluster_account‘,‘file_path‘, ‘filename‘)
39         db_table = ‘GenomicsFileInfo‘
40     def __unicode__(self):
41         return self.file_path

model--GenomicsFileInfo

1 添加新记录

数据库操作第一个,在Django也最常用的一个操作就是添加新记录,向表中添加记录有两种方式:

a. create

 1 ...
 2 from cnsa_service.models import GenomicsFileInfo #导入需要使用到的两个表
 3 from blast_service.models import DiskInfo #在GenomicsFileInfo表中disk_info设置的是连接了外键的,所以也需要导入这个DiskInfo表格
 4 ...
 5
 6 def add_line():  #使用create来添加一个新纪录
 7     GenomicsFileInfo.objects.create(cluster_account=‘luhuifang‘, filename=‘test2.fa.gz‘, file_path=‘/Users/xiaohui/work/ETL/09.CNSA/SRC/cngb_bak/bakup/cnsa/upload/luhuifang‘, size=‘5273‘, diskinfo=DiskInfo.objects.get(disk_path=‘/Users/xiaohui/work/ETL/09.CNSA/SRC/cngb_bak/bakup‘))
 8
 9 if __name__==‘__main__‘:
10     add_line()  

create

可以在Django管理后台查询到刚刚添加的新纪录:

b. save

...
from cnsa_service.models import GenomicsFileInfo
from blast_service.models import DiskInfo
...

def save_line(): #使用save方式添加新记录
    obj = GenomicsFileInfo(cluster_account=‘luhuifang‘, filename=‘test3.fa.gz‘, file_path=‘/Users/xiaohui/work/ETL/09.CNSA/SRC/cngb_bak/bakup/cnsa/upload/luhuifang‘, size=‘5273‘, diskinfo=DiskInfo.objects.get(disk_path=‘/Users/xiaohui/work/ETL/09.CNSA/SRC/cngb_bak/bakup‘))
    obj.save()  #一定要调用save()函数才能真正写入数据库中

if __name__==‘__main__‘:
    save_line()

save

同样可以在后台查询到新加的记录:

2 基础查询

基础查询就如同sql语句中的select,可以查询满足条件的记录:

a. 查询单一结果: get

这个函数只能查询数据库中满足条件记录数为1的记录,1)如果使用此函数查询结果记录数大于1,报MultipleObjectsReturned错误;2)如果使用此函数查询不存在的记录,报DoesNotExist错误。

...
from cnsa_service.models import GenomicsFileInfo
...

def get_line():
    #objs = GenomicsFileInfo.objects.get(filename=‘LB_3.fastq.gz‘) #这条记录不存在,报错 DoesNotExist
    #objs = GenomicsFileInfo.objects.get(cluster_account=‘tianliu‘) #用户名为tianliu的记录有两条,会报错MultipleObjectsReturned

    objs = GenomicsFileInfo.objects.get(filename=‘LB_2.fastq.gz‘) #这次查询刚好返回数据库中只有一个记录的结果,正确运行
    if objs:
        print objs 

if __name__==‘__main__‘:
    get_line()

get

b. 查询所有记录:all

这个函数与get不同,使用all函数,可以不带参数,数据库表中所有记录都会被返回。

...
from cnsa_service.models import GenomicsFileInfo
...

def all_line():
    objs = GenomicsFileInfo.objects.all() #不带参数, 返回数据库中所有记录
    if objs:
        print objs

if __name__ == ‘__main__‘:
    all_line()

all

c. 查询结果计数:count

count函数是对查询的结果进行计数的函数。

...
from cnsa_service.models import GenomicsFileInfo
...

def count_line():
    objs = GenomicsFileInfo.objects.count() #统计数据库中所有记录的条数
    if objs:
        print objs

if __name__==‘__main__‘:
    count_line()

count

3 条件过滤查询

以上get和all函数要么只能查询一条记录,要么就查询所有记录,如果需求是查询一部分满足条件的记录怎么办呢?在Django中使用filter函数可以对查询结果进行过滤。

过滤条件的语法: 属性名称__比较符=值  ##因为语法中使用了两个下划线(__)来分割属性名称和比较符,所以属性名称中不可以包含两个下划线。

语法中的比较符可以包括以下:

...
from cnsa_service.models import GenomicsFileInfo
...
#exact:表示判等。
#查询用户名为 luhuifang 的文件记录
GenomicsFileInfo.objects.filter(cluster_account__exact=‘luhuifang‘)

#也可简写为:
GenomicsFileInfo.objects.filter(cluster_account=‘luhuifang‘)

#contains:是否包含,模糊查询。(说明:如果要包含%无需转义,直接写即可)
#例1:查询文件名中包含test的文件记录
GenomicsFileInfo.objects.filter(filename__contains=‘test‘)

#例2:startswith、endswith:以指定值开头或结尾。
GenomicsFileInfo.objects.filter(filename__endswith=‘fq.gz‘)

#`以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.`

#isnull:是否为null。
#例:查询md5值不为空的记录
GenomicsFileInfo.objects.filter(md5__isnull=False)

#in:是否包含在范围内。
#例:查询文件大小是0和1024的记录
GenomicsFileInfo.objects.filter(size__in=[0,1024])

#比较查询
# gt 大于 (greater then)
# gte 大于等于 (greater then equal)
# lt 小于 (less then)
#lte 小于等于 (less then equal)
#例:查询文件大小大于0的记录
GenomicsFileInfo.objects.filter(size__gt=0)

 
#日期查询,可以将datetime类型的字段分开年月日等等来进行比较运算。
#year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
#例:查询更新时间为2018年的文件记录。
GenomicsFileInfo.objects.filter(updatetime__year=2018)

#例:查询2019年3月1号之前更新的记录。
GenomicsFileInfo.objects.filter(updatetime__lt=‘2019-03-01‘)

4 查询排序

数据库查询排序是希望按照需求将查询到的结果进行排序,这个问题有两个方法解决:

a. 写模型的时候,在models.py中设置

...
from django.db import models
...
class GenomicsFileInfo(models.Model):
    ...
    class Meta:
        ordering = [‘updatetime‘] #这句话主要用作默认排序,这里是按照更新日期进行排序,以后查询的时候,结果都会默认按照更新日期从小到大进行排序,除非使用了显示的order_by函数

一个小问题:按照更新时间(updatetime字段)来排序,发现数据库保存的时间和现在的时间不一致,这个主要原因是Django默认的时间是格林尼治时间,与中国时间有8小时时差,要解决这个问题可以在Django的setting.py中修改配置:

...

LANGUAGE_CODE = ‘en-us‘

USE_I18N = True

USE_L10N = True

#USE_TZ = True  # 默认值为True,当这个值为True时表示使用默认时间(格林尼治时间),不管下面TIME_ZONE如何设置都没有用

USE_TZ = False  #自定义修改为False,表示使用以下TIME_ZONE设置的时区

TIME_ZONE = ‘Asia/Shanghai‘  #将TIME_ZONE设置为‘Asia/Shanghai‘表示使用上海的UTS时间

...

b. 使用order_by函数进行显示排序

使用filter函数过滤查询之后想对结果进行排序,则可以使用order_by函数:

...
from cnsa_service.models import GenomicsFileInfo
...
def order_line():
    objs = GenomicsFileInfo.objects.filter(cluster_account=‘luhuifang‘).order_by(‘updatetime‘)  #按照updatetime排序  #objs = GenomicsFileInfo.objects.filter(cluster_account=‘luhuifang‘).order_by(‘-updatetime‘)  #按照updatetime倒叙排序, 带多个参数就是按照多个字段排序
    if objs:
        for obj in objs:
            print ‘{0} {1}‘.format(obj.updatetime, obj.filename)

if __name__==‘__main__‘:
    order_line()

5 删除记录

删除记录使用delete函数

...
from cnsa_service.models import GenomicsFileInfo
...
def delete_line():
    objs = GenomicsFileInfo.objects.filter(cluster_account=‘tianliu‘).delete() #删除记录
    if objs:
        print objs

if __name__==‘__main__‘:
    delete_line()

6 修改记录

修改记录使用update函数

...
from cnsa_service.models import GenomicsFileInfo
...
def update_line():
    objs = GenomicsFileInfo.objects.filter(filename=‘test2.fa.gz‘).update(cluster_account=‘tianliu‘) #修改文件名为test2.fa.gz的记录的用户名为 tianliu
    if objs:
        print objs

if __name__==‘__main__‘:
    update_line()

原文地址:https://www.cnblogs.com/lu-xxhui/p/10451924.html

时间: 2024-11-02 23:22:45

Django基础--数据库操作的相关文章

Django模型-数据库操作

前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开始,进入到了Django模型,也就是数据库操作. 自带 Sqlite3 数据库查询方式 为了简单,使用Python自带的Sqlite3数据库进行实例说明. 先看一个传统的数据库操作示例: 1 from django.shortcuts import render 2 import sqlite3 3

Django与数据库操作

Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接) Flask,tornado --- pymysql SQLArchemy (ORM) ORM 操作简单 (只把对象和类的操作 生成对应的sql语句) 创建,修改 数据表的时候简单 速度比原生的sql慢 -- 先转换成sql语句 原生sql执行会快 脚本运行Django的ORM操作数据库 import os,sys import django sys.path.ap

django models 数据库操作

django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class Message(models.Model): pass class Teacher(models.Model): pass class Student(models.Model): GENDER_CHOICES = ( ('male', "男"), ('female', "女&q

django学习-数据库操作接口API--(CRUD)

初试API(数据库操作接口CRUD) 现在我们进入交互式python命令行,尝试一下django为你创建的各种API,通过以下命令打开python命令行: py -3 manage.py shell进入python命令行 D:\django\mysite>py -3 manage.py shell Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32 Type &quo

Python之路【第九篇】堡垒机基础&数据库操作

复习paramiko模块 Python的paramiko模块,是基于SSH用于连接远程服务器并执行相关操作. SSHClient #!/usr/bin/env python #-*- coding:utf-8 -*- __author__ = 'luo_t' import paramiko ''' 第一种方法 ''' ssh = paramiko.SSHClient() #创建SSH对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy

django的数据库操作回顾

1.数据库操作 - 单表操作 - all - filter models.tb.objects.filter(id=123) dic = {'id': 123, 'age__gt': 3} models.tb.objects.filter(**dic) - count - order_by ... - 一对多 # id name 1 河北 2 广东 3 山东 class Province(models.Model): name = models.CharField(max_length=32,)

Django之数据库操作

1.创建model表,在setting中添加app名称.配置数据 from django.db import models class userinfo(models.Model): #如果没有models.AutoField,默认会创建一个id的自增列 name = models.CharField(max_length=30) email = models.EmailField() memo = models.TextField() 运行:python manage.py makemigra

django 的数据库操作

Python代码 class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __unicode__(self): return self.name class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __unico

Django笔记-数据库操作(多对多关系)

1.项目结构 2.关键代码: data6.settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', ) DATABASES = { 'default': {