博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django的小记
阅读量:6192 次
发布时间:2019-06-21

本文共 5466 字,大约阅读时间需要 18 分钟。

大致按流程列出来

  在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中创建数据库表结构

1 from django.db import models 2  3 # Create your models here. 4  5 class UserInfo(models.Model): 6     """ 7     用户表 8     """ 9     nid = models.BigAutoField(primary_key=True)10     username = models.CharField(verbose_name='用户名', max_length=32, unique=True)11     password = models.CharField(verbose_name='密码', max_length=64)12     nickname = models.CharField(verbose_name='昵称', max_length=32)13     email = models.EmailField(verbose_name='邮箱', unique=True)14     avatar = models.ImageField(verbose_name='头像')15     create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)16 17     fans = models.ManyToManyField(18         verbose_name='粉丝',19         to='UserInfo',20         through='Fans',21         related_name='f',22         through_fields=('user', 'follower'),23     )

创建表时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()括号里

 

 

转载于:https://www.cnblogs.com/roygood/p/9977305.html

你可能感兴趣的文章
Windows Azure VM Role (7) 创建服务
查看>>
优化javaScript代码,提高执行效率
查看>>
SpringMVC 参数注入
查看>>
初学Sockets编程(二) 关于名称和地址族
查看>>
lucene segment会包含所有的索引文件,如tim tip等,可以认为是mini的独立索引
查看>>
Azure 基础:Queue Storage
查看>>
JavaScript精粹读书笔记(1,2)
查看>>
Solaris大半年使用感触
查看>>
十六进制之间的转换(二进制、八进制、十六进制、十进制)
查看>>
自己动手做聊天机器人 一-涉及知识【转】
查看>>
常用的一些javascript小技巧
查看>>
【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】下 ~ Net程序员的福利...
查看>>
【转】找了好久,IOS实现半翻页功能
查看>>
Mysql性能优化一
查看>>
SharePoint Framework 在Visual Studio Code中调试你的本地解决方案
查看>>
【转】self.myOutlet=nil、viewDidUnload、dealloc的本质剖析
查看>>
oracle 抽取 对方大字段数据
查看>>
理解.NET中的异常(二)
查看>>
基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 开发流程...
查看>>
[转]OOA/OOD/OOP区别
查看>>