大致按流程列出来

  在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')
        
                说明:1. 你是我的朋友,我可以有多个朋友,我也是你的朋友,你也可以有多个朋友,这就属于朋友间的多对多关系。
                           2. 会生成两张表,一张person表,只含有id和name。一张person_friends表含有id,from_person_id,to_person_id
                            person_friends:
                               

        

        3. OneToOneField
                class OneToOneField(othermodel[, parent_link=False, **options])

用来定义一对一关系。笼统地讲,它与声明了 unique=True 的 ForeignKey 非常相似,不同的是使用反向关联的时候,得到的不是一个对象列表,而是一个单独的对象。

在某个 model 扩展自另一个 model 时,这个字段是非常有用的;例如: 多表继承 (Multi-tableinheritance) 就是通过在子 model 中添加一个指向父 model 的一对一关联而实现的。

必须给该字段一个参数:被关联的 model 类。工作方式和 ForeignKey 一样,连递归关联 (recursive) 和 延后关联 (lazy) 都一样。 此外,OneToOneField 接受 ForeignKey 可接受的参数,只有一个参数是 OnetoOneField 专有的:OneToOneField.parent_link,如果为 True,并且作用于继承自某个父 model 的子 model 上(这里不能是延后继承,父 model 必须真实存在 ),那么该字段就会变成指向父类实例的引用(或者叫链接),而不是象其他OneToOneField 那样用于扩展父类并继承父类属性。

 
在Django2中models.ForeignKey(ColorDic)和models.OneToOneField(OneModel)中必须加入参数on_delete    

  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 参数

django默认情况下每一个主表的对象都有一个是外键的属性,可以通过它查询到所有关于子表的信息,这个属性的名字就是子表的名称小写加上_set,具体到这个就是student_set,默认返回的是QuerySet,定义外键的时候也可以传入一个参数related_name,在设置外键时给外键定义名称,和之前的_set操作的效果是一样的,这两个方法是相同的,可以在定义主表的外键的时候,直接就给外键定义好名称使用related_name  

表结构设计好后要生成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()括号里

 

最新文章

  1. C#导入导出数据你该知道的方法。
  2. js 四舍五入函数 toFixed(),小数位数精度
  3. svn那些错误
  4. [BZOJ1072][SCOI2007] 排列prem
  5. asp.Net2.0中TextBox设置只读后后台获取不到值的解决方法
  6. (转)ajax.dll,ajaxpro.dll的区别和用法
  7. css控制文本框的只读属性的方法
  8. Android -- BroadCastReceiver的简单使用
  9. 基于注解Spring MVC综合Hibernate(需要jar包,spring和Hibernate整合配置,springMVC组态,重定向,)批量删除
  10. ASP.NET.Core中使用AutoMapper
  11. Gym100971B Gym100971C Gym100971F Gym100971G Gym100971K Gym100971L(都是好写的题。。。) IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13, 2016
  12. vue中使用Ueditor编辑器
  13. jquery1.6中的.prop()和.attr()异同
  14. 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
  15. cant found Microsoft.VSSDK.BuildTools.15.0.26201
  16. 用navicat手动删除了数据表的记录,再次写入的时候,怎么让id重新从1开始?
  17. linux 下程序员专用搜索源码用来替代grep的软件ack(后来发现一个更快的: ag), 且有vim插件的
  18. (转载)C# winform 在一个窗体中如何设置另一个窗体的TextBox的值
  19. 图解前序遍历线索化二叉树,前序线索二叉树遍历,C\C++描述
  20. PTA——猜数字游戏

热门文章

  1. github上项目的目录结构说明
  2. 请解释或描述一下Django的架构
  3. Prometheus配置文件
  4. android studio 使用第三方模拟器连接方法
  5. Java NIO?看这一篇就够了!
  6. Linux压缩和解压类指令
  7. 如何在wcf中用net tcp协议进行通讯
  8. PHP用strtotime()函数比较两个时间的大小实例详解
  9. docker 监控之 cadvisor
  10. 拒绝让Eclipse帮倒忙,解决其复制粘贴时把反斜杠变成双反斜杠的问题