Django笔记(五)

重定向

  • 什么是重定向
    • 向新的访问地址发送请求(服务器端)
  • 语法
    • from djangp.htmmp import HttpResponseRedirect
    • return HttpResponseRedirect(url)

ORM操作

  • 将数据表中所有人的年龄都增加10岁
    • update index_author set age=age+10
    • Author.objects.all().update(age=10)

F()操作

  • 取出某个字段的值再做操作
  • 例如
    • 浏览量自增
    • 所有人的年龄都增加10岁
  • 作用
    • 在执行操作中,获取某列的值时使用
  • 语法
    • F(‘列名’)
    • 导入 from django.db.models import F
    • 使用 Author.objects.all().update(age=F('age')+10)
    • 注意:
    • F必须用于某个操作中
    • 脱离操作F无法使用

实战案例源码

from django.db.models import F

# 作者列表 def authorList(request): # authors = Author.objects.all() # authors = Author.objects.filter(isActive=True) # 所有人的年龄都增加10岁 Author.objects.all().update(age=F('age') + 10) authors = Author.objects.filter(isActive__exact=True) return render(request, 'authorList.html', { 'authors': authors, }) 
Python

Q()操作

  • Author.objects.filter(id=1,age=35) 且操作
  • 那么或操作如何处理呢,这个时候就需要用到Q()了
  • 作用
    • 在查询条件中,可以完成或(or)的操作
  • 语法
    • from django.db.models import Q
    • Q(表达式)|Q(表达式)
  • 案例
    • 查询作者表中id=3或者年龄大于等于70的信息
    • Author.objects.filter(Q(id__exact=3)|Q(age__gt=70))
    • select *from index_author where id=3 or age>=70

实战案例源码

# 作者列表
def authorList(request): # authors = Author.objects.all() # authors = Author.objects.filter(isActive=True) # 所有人的年龄都增加10岁 # Author.objects.all().update(age=F('age') + 10) # 查询id=3 或年龄大于等于80岁的人 authors = Author.objects.filter(Q(id__exact=3) | Q(age__gt=80), isActive__exact=True) # authors = Author.objects.filter(isActive__exact=True) return render(request, 'authorList.html', { 'authors': authors, }) 
Python

原生的数据库操作方法

  • 主要分两个方法
    • 查询
    • 增删改

查询

  • 函数
    • raw(原生sql语句)
  • 语法
    • Entry.objects.raw(sql)
  • 返回
    • 返回的是列表嵌套对象的数据集

原生sql语句实战案例源码

# 作者列表
def authorList(request): # authors = Author.objects.all() # authors = Author.objects.filter(isActive=True) # 所有人的年龄都增加10岁 # Author.objects.all().update(age=F('age') + 10) # 查询id=3 或年龄大于等于80岁的人 # authors = Author.objects.filter(Q(id__exact=3) | Q(age__gt=80), isActive__exact=True) # 原生sql语句查询 authors=Author.objects.raw('select *from index_author') # authors = Author.objects.filter(isActive__exact=True) return render(request, 'authorList.html', { 'authors': authors, }) 
Python

增删改的方法

  • with connection.cursor() as cursor
  • sql='delete from author whe id=1'
  • cursor.execute(sql)
  • return HttpResponse("...")

实战案例源码

 # 原生的增删改查询
    # from django.db.models import connection
    # with connection.cursor() as cursor:
    #     sql='....'
    # cursor.execute(sql) 
Python

使用后台管理Models

  • 后台的配置
    • 登录地址 : 主路由/admin
  • 创建后台管理员
    • python manage.py createsuperuser
    • 权限管理的分组

基本管理

  • 在应用中的admin.py中注册要管理的实体类
  • admin.py
    • 作用
    • 注册需要管理的models
    • 只有再次注册的models才允许被管理
  • 注册models
    • 导入模型 from .models import Author,Publisher,Book
    • 注册模型 admin.site.register(Author)
    • 一条语句只能注册一个模型
    • 要注册多个模型需要分多次注册

注册管理模型实战案例源码

from django.contrib import admin
from .models import Author, Publisher, Book # Register your models here. admin.site.register(Author) admin.site.register(Book) admin.site.register(Publisher) 
Python

修改models.py处理显示内容

  • 在models.py中为各个class追加
    • def __str__(self):retur self "当前类的主要属性名"

实战案例源码

# 出版社
class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=20) city = models.CharField(max_length=20) country = models.CharField(max_length=20) website = models.URLField() def __str__(self): return self.name # 作者 Author:name age email class Author(models.Model): name = models.CharField(max_length=32) age = models.PositiveSmallIntegerField() email = models.EmailField(null=True) # 增加一个状态列,来表示用户是启用的还是禁用的 isActive = models.BooleanField(default=True) def __str__(self): return self.name # 图书 Book:title publicate_date class Book(models.Model): title = models.CharField(max_length=32) publicate_date = models.DateField(auto_now=True) def __str__(self): return self.title 
Python

通过models类的内部类Meta定义每个类的展现形式

class Author(models.Model): ... class Meta: #常用的属性 db_table = '作者' #指定改实体类对应到的表的名称 verbose_name= '作者' #定义该实体类在后台管理的列表页中的名称(单数形式) # 修改后台表名用以下一个属性即可 verbose_name_plural=verbose_name #效果同上,但是是复数形式 ordering= #指定实体数据列表页中的排序规则 quzh,默认升序,降序添加负号 
Python

修改后台管理显示表名实战案例源码

# 出版社
class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name='出版社名称') address = models.CharField(max_length=20, verbose_name='地址') city = models.CharField(max_length=20, verbose_name='所在城市') country = models.CharField(max_length=20, verbose_name='所在国家') website = models.URLField(verbose_name='官网') def __str__(self): return self.name class Meta: verbose_name_plural = '出版社' ordering = ['city', 'name'] # 作者 Author:name age email class Author(models.Model): name = models.CharField(max_length=32, verbose_name='姓名') age = models.PositiveSmallIntegerField(verbose_name='年龄') email = models.EmailField(null=True, verbose_name='邮箱') # 增加一个状态列,来表示用户是启用的还是禁用的 isActive = models.BooleanField(default=True) def __str__(self): return self.name class Meta: verbose_name_plural = '作者' # 排序 年龄降序 id升序 ordering = ['-age', 'id'] # 图书 Book:title publicate_date class Book(models.Model): title = models.CharField(max_length=32, verbose_name='书名') publicate_date = models.DateField(auto_now=True, verbose_name='出版日期') def __str__(self): return self.title class Meta: verbose_name_plural = '图书' ordering = ['-publicate_date', 'title'] 
Python

高级管理

  • 在admin.py中创建高级管理类
    • 定义EntryAdmin,继承自admin.ModelAdmin
    • class AuthorAdmin(admin.ModelAdmin):
  • 注册高级管理类
    • admin.site.register(Author,AuthorAdmin)

ModelAdmin的所有属性(摘录自Django源码)

class ModelAdmin(BaseModelAdmin): "Encapsulates all admin options and functionality for a given model." list_display = ('__str__',)#要显示的字段 list_display_links = ()#要设置为链接的字段 list_filter = ()#过滤的字段 list_select_related = False list_per_page = 100 list_max_show_all = 200 list_editable = () search_fields = () date_hierarchy = None save_as = False save_as_continue = True save_on_top = False paginator = Paginator preserve_filters = True inlines = [] # Custom templates (designed to be over-ridden in subclasses) add_form_template = None change_form_template = None change_list_template = None delete_confirmation_template = None delete_selected_confirmation_template = None object_history_template = None popup_response_template = None # Actions actions = [] action_form = helpers.ActionForm actions_on_top = True actions_on_bottom = False actions_selection_counter = True checks_class = ModelAdminChecks 
Python

定制高级管理信息

  • list_display
    • 作用
    • 指定在列表页中能够显示的字段
    • 参数
    • 元组 list_display = ('name', 'age', 'email')
    • 列表 list_display = ['name', 'age', 'email']
    • 两种方式的显示效果在后台完全一样
  • list_display_links
    • 作用
    • 指定在列表中能够连接到详情页的字段们
    • 参数
    • 由属性名称组成的元组或列表
    • 必须出现在list_display的取值中
    • list_display_links = ['name', 'age', 'email']
  • list_editable
    • 作用
    • 指定在列表页中就允许被编辑的字段们
    • 参数
    • 取值不能出现在list_display_links中
    • 但是必须出现在list_display中
    • list_editable = ['age', 'email']
  • search_fields
    • 作用
    • 添加允许被搜索的字段们
    • 参数
    • 元组
    • 列表
    • 案例
    • search_fields = ['name', 'age', 'email']
  • list_filter
    • 作用
    • 在列表的右侧过滤器实现快速筛选
    • 参数
    • 元组
    • 列表
    • 案例
    • list_filter = ['age']
  • date_hierarchy
    • 作用
    • 在列表页的上方增加一个时间选择器
    • 可以根据时间实现快速筛选
    • 参数
    • DateField
    • DateTimeField
    • 案例
    • date_hierarchy = 'publicate_date'
  • fields
    • 作用
    • 在详情页面中指定显示哪些字段,并按照什么样的顺序显示
    • 当只希望部分字段允许被修改的时候可用
    • 取值
    • 元组
    • 列表
    • 案例
    • fields = ('name', 'city')
  • fieldsets
    • 作用
    • 在详情页中,对字段们进行分组显示
    • 注意
    • fieldsets和fields是不能共存的
    • 语法
    • fieldsets=((字段1,字段2),(字段3,字段4…))

分组案例实战源码

class PulisherAdmin(admin.ModelAdmin): # fields = ('name', 'city') fieldsets = ( ('分组1', {'fields': ('name', 'city'), 'classes': ('collapse',)}), ('分组2', {'fields': ('country', 'website')})) list_display = ['name', 'city', 'country', 'website'] 
Python

关系映射

  • 一对一映射
  • 一对多映射
  • 多对多映射

一对一映射

  • 什么是一对一
    • A表中的一条记录只能与B表中的一条记录相关联
    • 案例
    • 作者和作者详情
    • 图书和图书详情
    • 博客和博客详情
    • 数据库中实现
    • A表:设置主键
    • B表:增加一列,并引用自A表的主键,增加一个唯一约束unique
  • 语法
    • 在关联的两个表中的任何一个类中增加
    • 属性=models.OneToOneField(Entry)
    • 报错问题
    • 添加外键不给默认值会报错
    • 处理方法一般有两种
      • 1 删除原本的数据
      • 2 将外键设置的一个default值或者null=True
  • 查询
    • 正向查询:通过wife找author
    • wife=wife.objects.get(id=1)
    • author=wife.author
    • 反向查询:通过author找wife
    • 技巧 类名小写__
    • author=Author.objects.get(id=3)
    • wife=author.wife
    • wife是Django通过OneToOneField在Author中默认增加的一个隐式属性
      • 看不到
      • 不用自己写
      • 但是可以调用

正向查询作者妻子实战源码

# 查询作者妻子
def authorWife(request): #正向查询 author = Author.objects.get(id=2) wife = author.wife l = ["妻子名字:{}".format(wife.name)] return HttpResponse(l) 
Python

反向查询妻子老公实战源码

# 查询作者妻子
def authorWife(request): # 正向查询 author = Author.objects.get(id=2) wife = author.wife l = ["妻子名字:{}".format(wife.name)] # 反向查询 wife = Wife.objects.get(id=3) author = wife.author l.append( '<br>老公名字:{}'.format(author.name)) return HttpResponse(l)

猜你喜欢

转载自www.cnblogs.com/gx-1/p/10509384.html