深浅赋值+orm操作+Django-admin简单配置
知识点
深浅copy
浅值深id
orm操作
ManyToManyField 虚拟字段
告诉Django orm 自动帮你创建第三张表
查询的时候可以借助该字段跨表
外键属性可赋值外联对象
Model.object下13个必会操作
返回QuerySet对象的方法有
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的QuerySet
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列
返回具体对象的
get()
first()
last()
返回布尔值的方法有:
exists()
返回数字的方法有
count()
外键操作
add
remove
set
上面三个可以传一个或多个参数(可迭代数据类型) 并且即可以是数字也可以是对象
clear
不传参数 直接清空
以上方法使用时会清空缓存,所以不需要再用save()。
跨表查询
基于对象的跨表查询 (都是子查询),‘.’连接
基于对象的反向查询 除了一对一直接点表名小写就可以拿到关联对象
一对多个多对多反向都必须 表名小写_set
基于双下划线的跨表查询 (都是联表查询)
关键是:正向字段反向表名小写
正-反向查询
外键正向,按外键字段
被外键反向,按表名小写 8|0Django终端打印SQL语句 if __name__ == '__main__':
作为脚本执行时内容
else:
作为模块时内容 查询集
Django中的QuerySet本质上是一个懒加载的对象,作用是进行表级操作,返回结果集(一张视图:类型<class 'django.db.models.query.QuerySet'>值<QuerySet [<Person: Person object (1)>, <Person: Person object (2)>]>或一条记录:类型<class 'TestModels.models.Person'>值Person object (1)),当结果集是视图时可链式调用。<QuerySet [<Person: Person object (1)>, <Person: Person object (2)>]>
URL路由反向解析---后台反向解析
django.urls.reverse(name,args) 只有理解并记住的才能算是自己的。才是对未来学习内容做减法。越接近本质、简洁模型,越利于理解、记忆。学习、运用、减负效果越好。
10m对人陨石 100m对地区 1km对洲 10km 对行星陨石 settings源码
算法
总结:manage.py 中设置'DJANGO_SETTINGS_MODULE'缺省值为'untitled.settings'模块字符串,再利用上述方法读取全局设置'global_settings'为字典再向字典中写入用户设置(有优点:利用了键的再赋值实现了用户设置高优先级,和用户设置参数的可扩展性)
'DJANGO_SETTINGS_MODULE'='untitled.settings'
'DJANGO_SETTINGS_MODULE'+'global_settings'->'ENVIRONMENT_VARIABLE'
第三方存储(如os.environ)暴露给用户的设置文件模块导入名,构造一个类来存储设置键值对,导入两个设置模块(用户设置文件要先从第三方读取模块名再利用importlib模块导入),依次利用getattr()、setattr()将两个设置模块的名称空间内键值对写入该类
知识点
importlib模块
利用importlib可以导入‘模块名字符串’代表的模块
os与sys
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。
项目测试启动文件
/xxx.py
import os
import sys
BASE_DIR=os.path.dirname(__file__)
sys.path.append(BASE_DIR)
···
from importlib模块
getattr(名称空间(模块名))、setattr(object,name,value) admin文件用户配置
配置类,继承admin.ModelAdmin类
五大配置参数
list_display 控制展示字段 注意不能放多对多字段
list_display_links 控制链接展示字段 注意不能放多对多字段
search_fields 多字段检索 注意不能放多对多字段
list_filter 筛选列表 多用于放外键字段
class BookConfig(admin.ModelAdmin):
list_display = ['title','price','publish_date','publish']
list_display_links = ['title','price']
search_fields = ['title','price']
list_filter = ['publish','authors']
def patch_init(self,request,queryset):#固定参数
queryset.update(price=666)#2.queryset选择集操作方法逻辑
patch_init.short_description = '价格批量修改'#3.方法简称
actions = [patch_init]#1.actions操作框批量处理函数方法列
admin.site.register(models.Book,BookConfig) admin运行逻辑
1.admin启动源码
django在启动的时候会依次执行每一个应用下的admin.py文件
manage.py->settings.py~~~'django.contrib.admin'->autodiscover_modules('admin',register_to=site)->AdminSiteClass=import_string(apps.get_app_config('admin').default_site)
单例模式
2.注册源码
admin.py注册语句
admin.site.register(models.Publish) # 仅仅是将注册了的模型表和以模型表为参数实例化产生的对象
# 当做键值对存入了site对象中的_registry字段
3.URL
admin会给每一个注册了的表生成增删改查四条url
路由分发的本质
路由:url('',func,None,None) 可迭代 路由分发的本质为视图函数替换为路由数列,多级为视图函数替换为标准路由分发组
个性化后台管理应用设计与实现
stark(自定义后台管理应用应用名)
启动 通过stark读取其他应用中的stark.py
令django一启动就要执行每一个应用下的stark.py文件#该文件如果被用户在应用下创建,替代应用下的admin.py文件
算法:
配置文件中注册:
INSTALLED_APPS = [
'stark.apps.StarkConfig',
]
app配置模块apps.py 添加:
def ready(self):#函数重写
from django.utils.module_loading import autodiscover_modules
return autodiscover_modules('stark')
注册 在其他应用admin.py和urls.py中替代django.contrib.admin.site使用
应用下创建stark.py
快复制Django默认admin配置 django.contrib.admin.sites和django.contrib.admin.ModelAdmin中的内容,根据需要重写方法
算法:
site=管理站点类(admin中是AdminSite()),
管理站点类中需要用到模型管理类(admin中是django.contrib.admin.ModelAdmin),这两个类中的诸般方法根据用户需要重写
1.二级路由分发
为了实现二级路由生成,一级路由写在管理站点类,二级路有写在模型管理类,因为:
class ModelStark(object):
list_display = ['__str__',]
def __init__(self,model):
self.model = model
2.
深浅赋值+orm操作+Django-admin简单配置的更多相关文章
- Django Admin 简单部署上线
前言 打算为公司弄一个管理公用密码的平台,由于比较懒,就选择使用Django admin,默认的admin并不漂亮,于是我使用了这个django-suit插件来美化 如图: 是不是比原来的漂亮多了. ...
- Django admin参数配置
admin参数配置 一. admin 启动 admin: Django的后台数据管理的web版本 针对Food表,url: http://127.0.0.1:8000/admin/app02/food ...
- 如何给django admin.py配置超级管理员?注册表格?
admin.py是django给我们提供的功能非常强大的后台,况且支持拓展,,如果你要是觉得admin的后台不够牛逼你可以自己写一个!如何自己写一个后台,后面我有时间了会给大家更新!一起学习!一起进步 ...
- django admin site配置(二)
1. ModelAdmin.inlines 将有外键的子类包含进视图 ,实例: class Author(models.Model): name = models.CharField(max_leng ...
- Django admin简单介绍
生成同步数据库的脚本: python manage.py makemigrations 同步数据库: python manage.py migrate 创建后台用户 python manage.py ...
- 【Django admin 中文配置】
打开settings.py文件,找到语言编码.时区的设置项,将内容改为如下: [其中 zh-Hans是简体中文 zh-Hant是繁体中文] LANGUAGE_CODE = 'zh-Hans' # LA ...
- 01: 重写Django admin
目录: 1.1 重写Django admin项目各文件作用# 1.2 重写Django admin用户认证 1.3 将要显示的表注册到我们自己的kind_admin.py中 1.4 项目首页:显示注册 ...
- Django学习——静态文件配置、request对象方法、pycharm如何链接数据库、Django如何指定数据库、Django orm操作
静态文件配置 # 1.静态文件 网站所使用的已经提前写好的文件 css文件 js文件 img文件 第三方文件 我们在存储静态文件资源的时候一般默认都是放在static文件夹下 # 2.Django静态 ...
- WEB框架Django之ORM操作
一 ORM的简介 MVC或者MVC框架中包括的一个重要部分就是ORM,它实现了数据模型与数据库的解耦. 即数据模型的设计不需要依赖于特定的数据库,通过简单的配置可以轻松更换数据库,这可以大大减少开发人 ...
随机推荐
- Python列表操作与深浅拷贝(7)——列表深浅拷贝、删除、反转、排序
列表复制 浅拷贝:简单类型元素全复制,引用类型元素只复制引用 L1 = [3,2,1,[4,5,6],8,'abc'] L1 [3, 2, 1, [4, 5, 6], 8, 'abc'] L2 = L ...
- nodejs简单http日志存储
nodejs实现简单http日志存储 /* 日志存储: 202.189.63.115 - - [31/Aug/2008:15:42:31 +0800] "GET / HTTP/1.1&quo ...
- super与this用法
super注意点: 1.当super调用父类的构造方法,必须在构造方法的第一个: 2.super必须只能出现在子类的方法或者构造方法中: 3.super和this不能同时调用构造方法: 4.super ...
- 【使用篇二】SpringBoot整合Servlet(1)
两种方式: 通过注解扫描完成 Servlet组件的注册 通过方法完成 Servlet组件的注册 一.通过注解扫描完成 Servlet 组件的注册 1. 编写Servlet类 /** * SpringB ...
- springboot配置spring security 静态资源不能访问
在springboot整合spring security 过程中曾遇到下面问题:(spring boot 2.0以上版本 spring security 5.x (spring secur ...
- 4.Vue双向绑定
1.什么是双向数据绑定 Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化.这也算是 Vue.js 的精髓之处了 ...
- SQL Server 迁移数据库 (一)导入和导出
今天正好换服务器,记录一下迁移数据库的过程. 以前经常用备份还原法,今天试试‘SQL Server 2016 导入和导出数据’这个看怎么玩. 1. 建数据库结构 1.1 在需要迁移的数据库名字上右击, ...
- c++的CreateFile导致内存不能为written错误
LPCWSTR szFileName; szFileName=argv[2]; //LPCWSTR szFileName=L"test.txt";//文件名字可以根据自己的需要修改 ...
- [LeetCode] 905. Sort Array By Parity 按奇偶排序数组
Given an array A of non-negative integers, return an array consisting of all the even elements of A, ...
- find square root
public class Solution { public static void main(String[] args) { Scanner ip = new Scanner(System.in) ...