zoukankan      html  css  js  c++  java
  • django之model操作初级篇

    1、django中数据库引擎是在settings.py文件中配置:

      

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    • ENGINE告诉django使用那个数据库引擎。本例中使用SQLite,默认数据库引擎
    • NAME告诉django数据的名称。

    2、项目和应用之间的区别:一个是配置,一个是代码

    • 一个项目是一系列Django应用的实例,外加那些应用的配置。严格来说一个项目唯一需要的是一个设定文件,定义数据库连接信息、安装的应用列表、DIRS,等等。
    • 一个应用是一系列边写的django功能,通常包含模型和视图。打包在一个python包里面。django自带了一些应用,例如管理后台。这些应用的determined指出是便携,可以在多个项目中复用。

    3、python代替SQL定义数据模型的原因:

    • 内省(introspection)有开销,而且不完美。为了提供便利的数据访问(api),Django需要已某种方式知晓数据库布局,而这一需求有两种实现方式。第一种是使用Python明确描述数据,第二种是在运行是内省数据库,推知数据模型。第二种方式在一个地方存储表的元数据,看似更简单,其实会导致几个问题。首先运行是内兴建数据库肯定有消耗。如果每次执行请求,或者只是初始化Webn服务器都要内省数据库,那带来的消耗是无法接受的。其次,有些数据库,尤其是旧版MySQL,存储的元数据不足以完成内省。
    • Python编写起来让人心情舒畅,而且使用Python编写所有代码无需频繁让大脑切换情景。在一个编程环境(思维)中待久了,有助于提高效率。在SQL和Python之间换来换去容易打断状态。
    • 把数据模型保存在代码中比保存在数据库中易于做版本控制,易于跟踪数据布局的变化。
    • SQL对数据布局的元数据只有部分支持。例如,多数数据库系统没有提供专门表示电子邮件地址或URL的数据类型。而Django模型有。高层及的数据结构有助于提升效率,让代码更便于福复用。
    • 不同数据库平台使用的SQL不一致。
    • 缺点:模型的Python代码可能与数据库的真正结构脱节。

    4、创建图书模型:

    from django.db import models
    
    
    class Publisher(models.Model):
        name = models.CharField(max_length=32)
        address = models.CharField(max_length=64)
        city = models.CharField(max_length=64)
        state_province = models.CharField(max_length=32)
        country = models.CharField(max_length=64)
        website = models.URLField()
    
        def __str__(self):
            return self.name
    
    
    class Author(models.Model):
        first_name = models.CharField(max_length=32)
        last_name = models.CharField(max_length=32)
        email = models.EmailField()
    
        def __str__(self):
            return '%s %s' % (self.first_name,self.last_name)
    
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey('Publisher',to_field='id')
        publication_date = models.DateField()
    
        def __str__(self):
            return self.title

     添加数据:Publisher.objects.create(name="O'Reilly",address='10 Fawcett St.',city='Cambridge',state_province='MA',country='U.S.A',website='http://www.oreilly.com')

     获取全部数据:Publisher.objects.all()

      objects属性,叫管理器(manager)。管理器负责所有“表层”数据操作,包括(最重要的)数据查询。所有模型都自动获得一个objects管理器,需要查询模型实例时都要使用它。

      all方法,是objects管理器的一个方法,返回数据库中的所有行。返回的是一个QuerySet。

       获取特定数据:Publisher.objects.filter(id='xxx')

      filter过滤数据,返回的也是一个QuerySet对象

      检索单个对象:Publisher.objects.get(name='Apress')  返回的只是一个对象。

      排序数据,使用order_by()方法:Publisher.objects.order_by('name'),可以多个参数排序;倒序在字段名前面加上“-”(减号):Publisher.objects.order_by('-name').

      虽然order_by()有一定的灵活性,但是每次都调用它相当频繁。多数时候,我们时钟使用一个字段排序。可以在模型中指定默认排序:

    class Publisher(models.Model):
        name = models.CharField(max_length=32)
        address = models.CharField(max_length=64)
        city = models.CharField(max_length=64)
        state_province = models.CharField(max_length=32)
        country = models.CharField(max_length=64)
        website = models.URLField()
    
        def __str__(self):
            return self.name
        
        class Meta:
            ordering=['name']

      这里出现了一个新概念,内嵌在Publisher类定义体中的class Meta。任何模型都可以使用Meta类指定多个针对所在模型的选项。

      链式查找:Publisher.objects.filter(country="U.S.A.").order_by("-name")

      切片数据:Publisher.objects.order_by('name')[0]

      数据更新:

      

    第一种方法:
        p = Publisher.objects.get(name='Apress')
        p.name = 'Apress Publishing'
        p.save()
    第二种方法:
        Publisher.objects.filter(id=52).update(name='Apress Publishing')

      删除数据:

    第一种方法:
        p = Publisher.objects.get(name="O'Reilly")
        p.delete()
    第二种方法:
        Publisher.objects.filter(country='USA').delete()
        Publisher.objects.all().delete()
  • 相关阅读:
    BZOJ 3150 [Ctsc2013]猴子 ——期望DP 高斯消元
    BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集
    BZOJ 4590 [Shoi2015]自动刷题机 ——二分答案
    BZOJ 3462 DZY Loves Math II ——动态规划 组合数
    BZOJ 4827 [Shoi2017]分手是祝愿 ——期望DP
    BZOJ 4827 [Hnoi2017]礼物 ——FFT
    BZOJ 4826 [Hnoi2017]影魔 ——扫描线 单调栈
    ZOJ 3874 Permutation Graph ——分治 NTT
    UVA 12633 Super Rooks on Chessboard ——FFT
    HDU 2065 "红色病毒"问题 ——快速幂 生成函数
  • 原文地址:https://www.cnblogs.com/zhanlin/p/8330475.html
Copyright © 2011-2022 走看看