Django的小记
大致按流程列出来
在pycham中创建Django project时要确定机器上的版本及你要用的版本,机器上一般情况下默认最新版本2.1(2018年11月),根据需要下载相应版本
创建好工程后就要创建APP了,在terminal中用python manage.py startapp appname 创建APP,重点来了,要将你的APP名字添加到setting文件中INSTALLED_APPS下面
接着继续在setting中配置静态文件,在setting的最后一行即STATIC_URL = '/static/'之后,添加STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),),这一操作将名为static的静态文件做了配置,所以你的静态文件名要被命名为static
setting中还可以设置语言,在setting里默认会有LANGUAGE_CODE = 'en-us'默认是英语,这里的语言设置控制后台界面语言,我们可以改为中文LANGUAGE_CODE = 'zh-hans'。
接下来在urls中添加url时,有个点要注意,Django从1到2做出了一些改变,1中使用from django.conf.urls import url,用url(正则,函数)创建url,2推荐使用from django.urls import path,re_path ,要用正则匹配时使用re_path,例:re_path('page=(?P<page>\d+)&key=(?P<key>\w+)', views.detail, name="detail"),这里的name参数给你的url起个名字让能让你在其它地方明确引用它。
再多说点,由点及面稍微拓展下,我们的url正则会匹配到一些参数每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。
在使用Django 项目时,一个常见的需求是获得URL的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。
人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
换句话讲,需要的是一个DRY 机制。除了其它有点,它还允许设计的URL 可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。
获取一个URL 最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL 的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。
Django 提供一个办法是让URL 映射是URL 设计唯一的地方。你填充你的URLconf,然后可以双向使用它:
- 根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。
- 根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。
第二种方式叫做反向解析URL、反向URL 匹配、反向URL 查询或者简单的URL 反查。
在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查,这里就会用到我们之前说到的url的name:
- 在模板中:使用url模板标签。
{
%
url
'home'
%
},这里home就是我们起的别名
- 在Python 代码中:使用django.core.urlresolvers.reverse() 函数。
reverse(
"index"
, args
=
(
"2018"
, )),这里index就是我们起的别名
- 在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法。
在models.py中创建数据库表结构
from django.db import models # Create your models here. class UserInfo(models.Model):
"""
用户表
"""
nid = models.BigAutoField(primary_key=True)
username = models.CharField(verbose_name='用户名', max_length=32, unique=True)
password = models.CharField(verbose_name='密码', max_length=64)
nickname = models.CharField(verbose_name='昵称', max_length=32)
email = models.EmailField(verbose_name='邮箱', unique=True)
avatar = models.ImageField(verbose_name='头像')
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) fans = models.ManyToManyField(
verbose_name='粉丝',
to='UserInfo',
through='Fans',
related_name='f',
through_fields=('user', 'follower'),
)
创建表时class要继承models.Model,models.BigAutoField创建自增字段,verbose_name设置后台显示的字段名,unique=True设置唯一,models.DateTimeField时间字段,auto_now_add=True记录创建时的时间,还有一个auto_now记录变动时间,只要有改动时间就变动。
表的关联涉及
- 一对多,models.ForeignKey(ColorDic)
- 一对一,models.OneToOneField(OneModel)
- 多对多,authors = models.ManyToManyField(Author)
1. 关联尚未定义的Model
class Book(models.Model):name = models.CharField(max_length = 50)#如果Publisher与Author在Book后面定义,需要使用model 的名称,而不是使用 model 对象本身pub = models.ForeignKey('Publisher')authors = models.ManyToManyField('Author')class Publisher(models.Model):name = models.CharField(max_length = 50)class Author(models.Model):name = models.CharField(max_length = 30)
2. Model关联自身
1) Model可以与自身做多对一关系
class People(models.Model):name = models.CharField(max_length = 30)leader = models.ForeignKey('self', blank=True, null=True)
说明:一个领导有多个下属,一个下属对应一个直接领导,同时领导也是领导的下属。就属于多对一关系,且需要与自身做多对一关系。且注意,设计这表时要设置blank=True和null=True.2) Model可以与自身做多对多关系
class Person(models.Model):friends = models.ManyToManyField('self')
用来定义一对一关系。笼统地讲,它与声明了 unique=True 的 ForeignKey 非常相似,不同的是使用反向关联的时候,得到的不是一个对象列表,而是一个单独的对象。
在某个 model 扩展自另一个 model 时,这个字段是非常有用的;例如: 多表继承 (Multi-tableinheritance) 就是通过在子 model 中添加一个指向父 model 的一对一关联而实现的。
必须给该字段一个参数:被关联的 model 类。工作方式和 ForeignKey 一样,连递归关联 (recursive) 和 延后关联 (lazy) 都一样。 此外,OneToOneField 接受 ForeignKey 可接受的参数,只有一个参数是 OnetoOneField 专有的:OneToOneField.parent_link,如果为 True,并且作用于继承自某个父 model 的子 model 上(这里不能是延后继承,父 model 必须真实存在 ),那么该字段就会变成指向父类实例的引用(或者叫链接),而不是象其他OneToOneField 那样用于扩展父类并继承父类属性。
on_delete参数的各个值的含义:
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET, # 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
多对多(ManyToManyField)没有 on_delete 参数
表结构设计好后要生成migrations文件再到数据库中创建表
python manage.py makemigrations 命令将在当前app下的migrations里创建文件
接着python manage.py migrate 命令用migrations下的文件在数据库中创建表
继续啊
说一个取数据的操作,xxx = models.Student.objects.raw('select name from ooo_Student'),raw方法使得我们可以在Django中使用原生SQL语句做数据库操作,直接将原生sql语句加个引号' ' 写到raw()括号里
Django的小记的更多相关文章
- [Django] 单元测试小记
从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合理,单元测试写起来就麻烦的多呀.公司的项目一直都是用Dj ...
- Django细节小记
前记:Django的ORM.模块有很多函数细节,要学会多看文档学习函数的细节 聚合annotate()和aggregate()的使用 简言之,annotate()得到的是查询集,类似all(),只不过 ...
- Django学习小记1-安装配置
Django是一个开放源代码的Web应用框架,由Python写成. python 中的web框架有许多例如:Django.Tornado.Flask..而Django相较与其他WEB框架其优势为:大而 ...
- Django应用部署 - 上线指南
http://blog.csdn.net/pipisorry/article/details/46957613 python manage.py runserver已经很接近于服务器的形式,但是并不能 ...
- Python资源大全
The Python Tutorial (Python 2.7.11) 的中文翻译版本.Python Tutorial 为初学 Python 必备官方教程,本教程适用于 Python 2.7.X 系列 ...
- Github上的python开源项目
Python开源项目,期待大家和我们一起共同维护 github排名榜单 https://github.com/trending github搜索榜单:https://github.com/search ...
- django urls 配置小记
django urls 配置小记 首先应了解 django2.0在url的配置上较之以前的版本有点区别,在之前的版本是通过django.conf.urls.url函数来实现路径配置的 urlpatte ...
- Django 最好的缓存memcached的使用 小记
嗯,咳咳咳咳咳,这是在win平台上.linux平台上没折腾 首先你要在win上安装 Memcache 下载 :点我下载 里面有x64 和 x86 的.根据自己的系统版本来选择使用 使用命令行: 1 ...
- Django 1.9 admin 使用suit 小记
最近项目做到了后台管理的部分.Django虽然提供了后台管理,但是界面不咋好看.所以我使用了suit.官网http://djangosuit.com/ 步骤: 1,安装suit 项目settings. ...
随机推荐
- leetcode解题报告(32):Teemo Attacking
描述 In LLP world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poison ...
- [mysql8]新坑哈 更改Mysql 表的大小转换设置lower_case_table_names=1
在安装了8.0.14之后,初始化的时候在my.cnf里设置了lower_case_table_names=1,安装好了之后,启动报错: 1 2 3 4 5 2019-01-28T13:24:24.91 ...
- socket.error: [Errno 32] Broken pipe . tcp
经过检查发现,是由于客户端请求的链接,在一次循环之后,产生的套接字关闭,没有新的客户端套接字进行请求连接,所以产生broken pipe错误
- WSL2(Ubuntu)安装Docker
原文链接:https://www.cnblogs.com/blog5277/p/12071400.html 原文作者:博客园--曲高终和寡 *******************如果你看到这一行,说明 ...
- IIS错误代码500.21 ,Nhibernate更新报错,委托的使用。action传参数
快速阅读 IIS错误代码500.21 ,Nhibernate更新报错,委托的使用.action传参数 IIS错误代码500.21 HTTP 错误 500.21 - Internal Server Er ...
- RabbitMQ入门学习系列(六) Exchange的Topic类型
快速阅读 介绍exchange的topic类型,和Direct类型相似,但是增加了"."和"#"的匹配.比Direct类型灵活 Topic消息类型 特点是:to ...
- 利用Git上传项目到github以及遇到的问题
今天学习如何利用git从本地端上传项目,以及遇到问题的解决方法 1.要有自己的github账号,并创建一个仓库, 2.输入仓库的名称,直接Create 注:记住常见成功后的这个地址,后边要用到: 3. ...
- [Web前端] mac chrome 浏览器强制刷新,清除浏览器缓存
本文链接:https://blog.csdn.net/zeroyulong/article/details/79806156 mac 强制刷新:command+shift+r mac 普通刷新:com ...
- At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger fo
一.文章前言 本文是亲测有效解决At least one JAR was scanned for TLDs yet contained no TLDs问题,绝对不是为了积分随便粘贴复制然后压根都没有用 ...
- Java项目登录报Session Error
在web.xml文件添加下面红色代码即可,注意:添加代码后,格式化一下代码. <servlet> <servlet-name>dwr-invoker</se ...