Fork me on GitHub

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)
posted @ 2019-03-11 11:10  seymourgao  阅读(143)  评论(0编辑  收藏  举报