• Django--20170905--笔记


    一、django的安装

      1.先安装python

      2.再安装django:pip install django

      3.使用虚拟环境:pip install virtualenv

    二、项目的创建

      1.可以先创建一个虚拟目录

        创建虚拟目录:
            virtualenv --no-site-packages venv
        进入虚拟目录:
            source venv/bin/activate

      2.创建一个工程:

        创建:

          django-admin startproject projectName

        目录结构大致如下:

          

        启动服务:
            python manage.py runserver 0.0.0.0:8000

      3.创建app:

        进入projectName目录下运行:python manage.py startapp appName

        目录结构大致如下:

          

      4.创建模型:

        1.编辑model.py文件:如添加如下代码

     1 from django.db import models
     2 from django.utils import timezone
     3 import datetime
     4 # Create your models here.
     5 
     6 
     7 class Question(models.Model):
     8     question_text = models.CharField(max_length=200)
     9     pub_date = models.DateTimeField('date published')
    10 
    11     def __str__(self):  # __unicode__ on Python 2
    12         return self.question_text
    13 
    14     def was_published_recently(self):
    15         return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    16         was_published_recently.admin_order_field = 'pub_date'
    17         was_published_recently.boolean = True
    18         was_published_recently.short_description = 'Published recently?'
    19 
    20 
    21 class Choice(models.Model):
    22     question = models.ForeignKey(Question)
    23     choice_text = models.CharField(max_length=200)
    24     votes = models.IntegerField(default=0)
    25 
    26     def __str__(self):  # __unicode__ on Python 2
    27         return self.choice_text
    View Code

        注:类中相应的属性,对于数据库中表的相应列名

        2.编辑setting.py文件:

          1)修改数据库配置信息:(根据自己的数据库配置)

            DATABASES = {
              'default':{
              'ENGINE':'django.db.backends.mysql',
              'NAME':'pythontest',
              'USER':'root',
              'PASSWORD':'root',
              'HOST':'localhost',
              'PORT':'3306',
              }
            }

          2)修改INSTALLED_APPS,添加app:

            INSTALLED_APPS = [
              'django.contrib.admin',
              'django.contrib.auth',
              'django.contrib.contenttypes',
              'django.contrib.sessions',
              'django.contrib.messages',
              'django.contrib.staticfiles',
              'appName',
            ]

        3.同步数据库:(项目根目录下执行)

          python manage.py makemigrations polls
             python manage.py migrate

    ------------------------------------------------------------------------------------------------

    一.操作数据库

    1.创建对象--save()

      obejct = Object(name1='value1', name2='value2')

      object.save()

      others:

      object = Object.objects.create(name1='value1', name2='value2')

    2.保存对象的改动

      object.name1 = 'change value'

      object.save()

      更新ForeignKey 字段的方式和保存普通字段相同

      更新ManyToManyField 的方式有一些不同 —— 需要使用字段的add()方法来增加关联关系的一条记录。

    3.获取对象:通过模型的管理器构造一个查询集,来从数据库中获取对象

      管理器只可以通过模型的类访问,而不可以通过模型的实例访问

      获取所有对象:all_object = Object.objects.all()

        all() 方法返回了一个包含数据库表中所有记录查询集

      过滤条件:filter(**kwargs)、exclude(**kwargs)

        filter(**kwargs):包含满足查询参数的对象

        exclude(**kwargs):包含不满足查询参数的对象

      链式过滤:Object.objects.filter(...).exclude(...).filter(......)

      查询集是惰性执行的:创建查询集不会带来任何数据库的访问。你可以将过滤器保持一整天,直到查询集 需要求值时,Django 才会真正运行这个查询。

      获取单一的对象:Object.objects.get(pk=1)   !!!不是返回查询集,如果对象不存在或有多条将报错

    4.annotate(*args, **kwargs)

    5.order_by()用来排序:默认情况下,QuerySet 根据模型Meta 类的ordering 选项排序

      Object.objects.filter(pud_date__year=2017).order_by('-pub_date','headline'):根据pub_date降序,headline升序排序

      每个order_by() 都将清除前面的任何排序。

    6.reverse()

      reverse() 方法反向排序QuerySet 中返回的元素

    7.distinct([*fields])

      返回一个在SQL 查询中使用SELECT DISTINCT的新QuerySet它将去除查询结果中重复的行。

      对于正常的distinct()调用,数据库在确定哪些行不同时比较每行中的每个字段。对于具有指定字段名称的distinct()调用,数据库将仅比较指定的字段名称。

    8.values(*fields)

      返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象。

      Object.objects.values('id','name')

    9.values_list(*fields,flat=False)

      在迭代时返回的是元组而不是字典

    10.dates(field,kind,order='ASC')

      返回DateQuerySet - QuerySet,其计算结果为datetime.date对象列表,表示特定种类的所有可用日期QuerySetfield应为模型的DateField的名称。 kind应为"year""month""day"隐式的是升序排序

    11.datetimes(field_name,kind,order='ASC',tzinfo=None)

      返回QuerySet,其计算为datetime.datetime对象的列表,表示QuerySet内容中特定种类的所有可用日期.

      field_name应为模型的DateTimeField的名称。

      kind应为“year”“month”“day”“hour”“minute”“second”

    12.extra(select=Nonewhere=Noneparams=Nonetables=Noneorder_by=Noneselect_params=None)

    13.defer(*fields)

      在一些复杂的数据建模情况下,您的模型可能包含大量字段,其中一些可能包含大量数据(例如,文本字段),或者需要昂贵的处理来将它们转换为Python对象。如果您在某些情况下使用查询集的结果,当您最初获取数据时不知道是否需要这些特定字段,可以告诉Django不要从数据库中检索它们。

      具有延迟字段的查询集仍将返回模型实例

    14.only(*fields)

      only()方法或多或少与defer()相反

    15.using(alias)

      如果你使用多个数据库,这个方法用于控制QuerySet 将在哪个数据库上求值。这个方法的唯一参数是数据库的别名,定义在DATABASES

    16.select_for_update(nowait=False)

      返回一个 queryset  ,会锁定相关行直到事务结束。在支持的数据库上面产生一个SELECT ...FORUPDATE语句

    17.raw(raw_queryparams=Nonetranslations=None)

      接收一个原始的SQL 查询,执行它并返回一个django.db.models.query.RawQuerySet 实例。这个RawQuerySet 实例可以迭代以提供实例对象,就像普通的QuerySet 一样。

    18.使用Q 对象进行复杂的查询

      可以组合& 和|  操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询:

    Q(question__startswith='Who') | ~Q(pub_date__year=2005)
    Poll.objects.get(
        Q(question__startswith='Who'),
        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
    )
    翻译sql:
    SELECT * from polls WHERE question LIKE 'Who%'
        AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

     19.为了比较两个模型实例,只需要使用标准的Python 比较操作符,即双等于符号:==在后台,它会比较两个模型主键的值。

    20.删除方法,为了方便,就取名为delete()这个方法将立即删除对象且没有返回值。

    Entry.objects.filter(pub_date__year=2005).delete()

     21.拷贝模型实例

      最简单的方法是,只需要将pk 设置为None利用我们的Blog 示例: 

      blog = Blog(name='My blog', tagline='Blogging is easy')
      blog.save() # blog.pk == 1
      blog.pk = None
      blog.save() # blog.pk == 2

    ---------------------------------------------------------------------------------------------

    二、聚合

    1.一般的聚合查询方法:

      Object.objects.count()

      Object.objects.all().aggregate(Avg('price'))

      Object.objects.all().aggregate(Max('price'))

      Object.objetcs.annotate(num_books=Count('book')).order_by('num_books')[:5]

       aggregate()QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。

      逐个对象的汇总结果可以由annotate()子句生成。annotate()子句被指定之后,QuerySet中的每个对象都会被注上特定的值。

      annotate()子句的返回结果是一个查询集 (QuerySet)

      order_by()用来排序

      Object.objects.all().order_by('name1')

      values()分组

      Object.objects.values('name').annotate(average_rating=Avg('book__rating'))

      根据定义在values()  子句中的字段组合先对结果进行唯一的分组,再根据每个分组算出注解值, 这个注解值是根据分组中所有的成员计算而得的

      

      

      

      

  • 相关阅读:
    [原创] Laravel 启动流程
    修改电脑的TTL返回值
    Apache启动错误解决方法
    RemodelanyWhere11.0.2673版本下载
    函数指针
    指针与数组
    青蛙跳台阶
    旋转数组的最小数字
    对大量人的年龄排序
    泛型算法一
  • 原文地址:https://www.cnblogs.com/fqfanqi/p/7482466.html
Copyright © 2020-2023  润新知