Django整理

一、Django简介

Django是基于Python的Web开发框架,开源。是一个重量级框架,提供了众多的功能组件,让开发更简便快速。

二、MVC和MTV

MVC:

   model:模型层,负责数据库的建模以及CRUD的操作;

   views:视图层,用于处理用户显示的内容,生成页面展示的html内容;

   controller:处理业务逻辑,与Model和View交互,返回结果;

MTV:

   model:模型层,负责数据库的建模以及CRUD的操作;

   views:相当于MVC中的controller层;

   template:相当于MVC中的views层;

三、Django常用命令

安装:pip install django

创建Django项目:django-admin startproject 项目名

启动服务:python manage.py runserver

创建应用:python manage.py startapp 应用名称

数据库同步:python manage.py makemigrations,python manage.py migrate

       创建超级管理员:python manage.py createsuperuser

四、Django项目结构

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

外层mysite:项目名;内层mysite:项目主目录,包含该项目的所有文件,可当做一个包;

manage.py:命令行工具,管理Django的交互脚本。如启动服务、创建管理员、创建应用、数据库的同步操作等;

__init__.py:定义包的文件;

urls.py:项目的基础url配置文件,可以做路由的分配;

wsgi.py:应用服务器配置文件,提供底层的网络通信功能;

settings.py:项目的主配置文件

五、setting参数说明

BASE_DIR:获取当前项目的根目录路径;

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

DEBUG :调试模式

ALLOWED_HOSTS:设置允许访问本项目的地址列表,如果不设置只有本机可以访问。"*",表示任何地址都允许访问该项目(局域网);

ALLOWED_HOSTS = []

INSTALLED_APPS:指定已安装的应用,如果有自定义应用的话,需要在此位置进行注册;

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

MIDDLEWARE:指定注册的中间件;

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF:指定项目的基础路由配置文件;

ROOT_URLCONF = 'mysite.urls'

TEMPLATES:指定模板的信息;

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

DATABASES:指定数据库的信息;

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

LANGUAGE_CODE:指定网站的显示语言,如果要使用中文则可以修改为 zh-Hans;

LANGUAGE_CODE = 'en-us'

TIME_ZONE:指定时区,如果指定中国时区,则可以修改为  Asia/Shanghai;

TIME_ZONE = 'UTC'

​​​STATIC_URL:静态文件路径;

STATIC_URL = '/static/'

六、URL的使用

默认是在主目录中,主路由配置文件,会包含最基本的地址映射。每个请求到达之后,都会由urls.py中的urlpatterns 列表中的url()进行匹配,url()函数匹配上之后,可能将请求转交给其他的urls.py 或 视图(Views)去处理。

def url(regex, view, kwargs=None, name=None):
    if isinstance(view, (list, tuple)):
        # For include(...) processing.
        urlconf_module, app_name, namespace = view
        return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
    elif callable(view):
        return RegexURLPattern(regex, view, kwargs, name)
    else:
        raise TypeError('view must be a callable or a list/tuple in the case of include().')

 

七、Django应用(独立模块/功能)结构

python manage.py startapp polls

创建完应用需要在INSTALLED_APPS中注册,

INSTALLED_APPS = [..., 'polls']

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

migrations:存放数据库中间文件(日志文件);

admin.py:应用的后台管理配置文件;

apps.py:应用的属性配置文件;

models.py:模型文件,做ORM映射,数据库处理;

tests.py:测试模块;

views.py:定义视图的文件;

八、ORM中的CRUD

1.、增加操作

1、Entry.objects.create(属性=值,属性=值)        (Entry:具体要操作的Model类)

Author.objects.create(name='zhangsan', age=85)

2、创建一个 Models 对象,通过对象的 save() 完成增加

obj = Author(names='laoshe', age=65)

obj.save()

        3、使用字典构建对象,通过 save() 完成增加

dic = {
		'属性1': '值1',
		'属性2': '值2'
		}
obj = Entry(**dic)
obj.save()

2、查询操作

1、查询一条数据:get(条件),用法:Entry.objects.get(查询条件/表达式),该函数只适用于 返回一条记录时使用;

2、查询所有数据:all(),用法: Entry.objects.all();

        3、查询指定列:values('col1', 'col2', ...),用法:Entry.objects.values('col1', 'col2', ...)  或  Entry.objects.all().values('col1', 'col2', ...);

        4、排序函数:order_by('col1', 'col2', ...),用法:Entry.objects.order_byy('col1', '-col2', ...),默认的排序规则是升序,降序,则在列前添加一个 "-";

        5、对条件取反:exclude(),用法:Entry.objects.exclude(条件),如:Author.objects.exclude(id=3) 等同于select * from author where not (id=3);

        6、根据条件查询部分行数据:filter(参数),用法:Entry.objects.filter(参数)

               使用 Entry 中的属性作为查询参数:如  Author.objects.filter(id=1,name='莫言')  等同于  select * from author where id=1 and name='莫言';

               也可以使用查询表达式作为查询参数:如 等值判断: Entry.objects.filter(属性__exact=值),例:Author.objects.filter(id__exact=1);

                 __exact:精确查询,等值判断

                __contains:筛选出属性中包含指定关键字的记录(模糊查询)

                __lt、__lte、__gt、__gte:筛选出属性值小于、小于等于、大于、大于等于指定值的记录

        __startswith、__endswith:筛选出以指定关键字开始、结尾的记录

3、更新数据

1、修改单个数据:通过 get() 得到要修改的实体对象,对实体对象的属性修改属性值,再通过实体对象的save()保存回数据库;

au = Author.objects.get(id=1)
au.names = "老舍"
au.age = 45
au.save()

2、批量修改数据:调用查询结果集的 update() 完成批量修改,先查询出要修改的数据,再更新;

Author.objects.all().update(age=75, sex='male')
或者
Author.objects.filter(id=1).update(age=75, sex='male')

4、删除数据

调用实体对象/查询结果集的 delete()

如:删除单个对象,

       obj = Author.objects.get(id=1)

       obj.delete()

5、F()和Q()操作

         F():在执行操作中,获取某列的值时使用

from django.db.models import F
Author.objecs.all().update(age = F('age') + 10)

Q():在查询条件中,可以完成或(or)的操作,语法:Q(表达式) | Q(表达式)

如:Author.objects.filter(Q(id=6)|Q(age__gte=70))      查询Author实体中,id为6或年龄大于等于70的人的信息

6、原生数据库操作

查询:raw(sql语句)

增删改:execute(sql语句)

九、数据库关系映射

1、一对一

    语法:

           在关联的两个类的任何一个类中 增加:属性 = models.OneToOneField(Entry)

    例:

     class Wife(models.Model):

           ...

           author=models.OneToOneField(Author)

    查询:           

               正向查询:通过wife 找 author

                  1、获取 id 为1 的 Wife的信息:wife = Wife.objects.get(id=1)

                  2、通过 Wife 的关联属性 author 来找Author:author = wife.author

               反向查询:通过author 找 wife

                  1、获取 id 为14 的 Author的信息:author=Author.objects.get(id=14)

                  2、通过 author 的关联属性 wife 来找wife: wife = author.wife

                 wife 是Django通过OneToOneField在Author中默认增加的一个隐式属性

2、一对多

   语法:在"多"的实体中,增加: 属性 = models.ForeignKey(Entry)

   例:Book(多) 和 Publisher(一)

           class Book(models.Model):

              ... ...

              publisher = models.ForeignKey(Publisher)

   查询:

      正向查询 - 通过Book查询Publisher 

           #查询id为1的书籍的信息: book = Book.objects.get(id=1)

           #查询关联的publisher: publisher = book.publisher

       反向查询 - 通过Publisher查询Book

           Django会在 1 的实体中增加 关联对象_set 属性,用于查询 多 的数据

           结合 Publisher 和 Book 之间关系 :

              在 Publisher 中 增加了一个 book_set 属性

           例:

              publisher = Publisher.objects.get(id=1)

              books = publisher.book_set.all()

3、多对多

     语法:允许在任何一个实体中增加操作: 属性 = models.ManyToManyField(Entry)

    例:

        class Author(models.Model):

               ... ...

              book = models.ManyToManyField(Book)

    查询:   

      正向查询-通过Author查询所有的Book

           author = Author.objects.get(id=1)

           books = author.book.all()

           通过 关联属性.all() 查询所有对应数据

        反向查询-通过Book查询所有的Author

           Django中 会在Book 实体中增加一个隐式属性 author_set

           book = Book.objects.get(id=1)

           authors = book.author_set.all()

 十、class Meta中的元信息字段

1、db_table:指定该实体类对应到的表的名称

2、verbose_name:定义当前实体类在后台管理的列表页中的名称(单数形式)

3、verbose_name_plural:效果同上,是复数形式

4、ordering:指定实体数据列表页中的排序规则,取值是一个列表,默认按升序排序,降序则需要手动添加 负号

 

你可能感兴趣的:(python,python,django,orm)