zoukankan      html  css  js  c++  java
  • django模型操作数据库的常用方法——基本数据访问

    前提条件:

    1.  此处假定有一个app叫books,该books的模型定义如下:

    # -*- coding:utf-8 -*-
    from django.db import models
    
    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.URLField()
    
        def __str__(self):  #此方法可以让模型知道如何显示它自己
            return self.name
    
        class Meta:     #此类下的可选项有很多
            ordering = ['name']     #指定此类输出时默认的排序方式(按name排序)
    
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_time = models.CharField(max_length=40)
        email = models.EmailField()
    
        def __str__(self):
            return '{first_name} {last_name}'.format(first_name=self.first_name, last_time=self.last_name)
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
    
        def __str__(self):
            return self.title

    2. 在一个django项目中,运行 python  manage.py  shell   进入shell模式

    在shell命令行中展示基本数据访问方法:

    1. 两步完成对象的创建与存储至数据库

    >>> from books.models import Publisher
    >>> p1=Publisher(name='chuntian',address='123',city='xian',state_province='shanxi',country='china',website='http://www/123.com')   #实例化Publisher类,执行此句后,数据库里没有该条数据
    >>> p1.save()  #调用该对象的save()方法,才能将该数据保存至数据库

    2. 一步到位完成对象的创建与存储至数据库

    >>> from books.models import Publisher
    >>> p2=Publisher.objects.create(name='shine',address='456',city='tianjin',state_province='shanghai',country='china',website='http://www.555.com')  #使用create方法,一步到位向数据库中写数据

    又插入两条数据后,当前数据库中的记录为:

    3. 获取对象列表(从给定的模型中取出所有记录)

    注:此处获得的结果看起来像一个list,但是它实际上是一个QuerySet对象,这个对象是数据库中一些记录的集合

    >>> p_list = Publisher.objects.all()
    >>> print p_list
    [<Publisher: ahua>, <Publisher: chuntian>, <Publisher: huaxi>, <Publisher: luoyiren>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>]    #此处获取到这么多,是因为我添加的多,就用1.2方法添加的数据

    4.数据过滤

    注: 此处返回的是一个仿列表(QuerySet),若过滤没结果,则返回空列表(QuerySet),不会导致异常

    >>> cc = Publisher.objects.filter(name='shine')   #过滤出name='shine'那条记录
    >>> print cc
    [<Publisher: shine>]

    5.获取单个对象

    注: 此处返回的是单个对象,若结果为多个对象,会导致抛出异常,若查询没结果,也会导致异常

    >>> dd = Publisher.objects.get(name='chuntian')   #使用get方法获取单个对象
    >>> print dd
    chuntian

    6. 数据排序

    默认排序:

    >>> dd = Publisher.objects.all()   #此处是按模型中指定的默认排序方式 (即模型中写的按name排序)
    >>> print dd
    [<Publisher: ahua>, <Publisher: chuntian>, <Publisher: huaxi>, <Publisher: luoyiren>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>]

    正序:

    >>> cc = Publisher.objects.order_by('address')    #指定按address排序
    >>> print cc
    [<Publisher: chuntian>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>, <Publisher: huaxi>, <Publisher: ahua>, <Publisher: luoyiren>]    #结果中展示的是name,是因为模型中要求它是用name来展示自己的
    

    逆序:

    >>> cc = Publisher.objects.order_by("-address")   #按address逆向排序
    >>> print cc
    [<Publisher: xiaoming>, <Publisher: huaxi>, <Publisher: ahua>, <Publisher: luoyiren>, <Publisher: xiaohong>, <Publisher: shine>, <Publisher: chuntian>]

    注:此处正序和逆向差别这么大,是因为有4条记录的address是相同的,当address相同时,又会按照默认排序进行排序

    7. 数据的模糊查找(类似sql中的like查找)

    注:like查找的sql语句为:

    SELECT id, name, address, city, state_province, country, website
    FROM books_publisher
    WHERE name LIKE '%xiao%';
    >>> ff = Publisher.objects.filter(name__contains='xiao')  #name和contains之间有双下划线,这里的contains部分会被Django翻译成like语句
    >>> print ff
    [<Publisher: xiaohong>, <Publisher: xiaoming>]
    >>> 

    8. 连锁查询 (满足类似 需要同时进行过滤和排序查询操作  的需求)

    >>> cc = Publisher.objects.filter(address='xianla').order_by("-name")   #此处既有过滤又有排序
    >>> print cc
    [<Publisher: xiaoming>, <Publisher: luoyiren>, <Publisher: huaxi>, <Publisher: ahua>]

     9. 限制返回数据

    没有限制返回结果的:

    >>> cc = Publisher.objects.order_by('-name')   #按name逆序获得数据
    >>> print cc
    [<Publisher: xiaoming>, <Publisher: xiaohong>, <Publisher: shine>, <Publisher: luoyiren>, <Publisher: huaxi>, <Publisher: chuntian>, <Publisher: ahua>]

    有限制返回结果的:

    >>> cc = Publisher.objects.order_by('-name')[0:3]   #此处类似list中的切片,但是不支持负索引
    >>> print cc
    [<Publisher: xiaoming>, <Publisher: xiaohong>, <Publisher: shine>]

    10 . 更新多个对象

    指定更新的字段名:

    >>> cc = Publisher.objects.filter(name='shine').update(name='myshine')
    >>> print cc    #返回1,说明更新了一条记录
    1  
    >>> cc = Publisher.objects.filter(address='xianla').update(address='xianan')
    >>> print cc   #返回4,说明更新了4条记录
    4

    此时数据库中的记录为:

    不指定更新的字段名:

    >>> update_data = {'name':'wangxiaohua', 'address':'leshuidadao', 'city':'beijing'}
    >>> cc = Publisher.objects.filter(name='ahua').update(**update_data)   #传的参数为字典,更利于代码复用
    >>> print cc
    1

    此时数据库中的记录为:

    11. 删除对象

    方法一:

    >>> p = Publisher.objects.get(name='huaxi')
    >>> p.delete()

    此时数据库中的数据为:

    方法二:

    >>> Publisher.objects.filter(name='xiaohong').delete()

    方法三:

    >>> Publisher.objects.all().delete()           #一旦使用all方法,所有数据将会被删除,慎用
  • 相关阅读:
    Python 2.x版本和Python3.x版本的不同
    如何给澳洲路局写信refound罚金,遇到交通罚款怎么办
    Java 用自带dom解析器遍历叶子节点内容
    更改Xampp-sql的默认密码-配置appche运行环境
    TSP旅行商问题的Hopfield求解过程
    神经网络hopfield的学习
    分类器的组合算法提升准确率概要
    因子分析——主成份算法实现补充
    因子分析——主成份算法实现
    主成分分析PCA的前世今生
  • 原文地址:https://www.cnblogs.com/mujinxinian/p/7889847.html
Copyright © 2011-2022 走看看