我本来想搞下Django之select_related和prefetch_related的区别,看到这里有djangoapi的知识, 之前搞过django restfulapi,http://blog.csdn.net/iiiiher/article/details/77435615 ,算是搞起来了吧, 模块还不是很熟悉,djangorestframework, 快速的开放了接口给前端.

django api测试

django后台admin

文章-属于某个分类-拥有多个标签: foreignkey&manytomany

看下models的manytomany和foreignkey

参考Django之select_related和prefetch_related

pip install djangorestframework 的官网

stratproject learnapi
startapp app01

models.py

class Category(models.Model):
name = models.CharField(max_length=30, verbose_name="类名") #修改字段名显示
creat_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间") class Meta:#表名显示
verbose_name = "分类"
verbose_name_plural = verbose_name def __str__(self): #xxx添加成功
return u'%s' % self.name class Tag(models.Model):
name = models.CharField(max_length=30, verbose_name="标签名")
creat_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间") class Meta:
verbose_name = "标签"
verbose_name_plural = verbose_name def __str__(self):
return u'%s' % self.name class Post(models.Model):
title = models.CharField(max_length=255, verbose_name="标题")
slug = models.SlugField(max_length=300, allow_unicode=True, unique=True, verbose_name="小标题")
content = models.TextField(verbose_name="文章内容")
publish_time = models.DateTimeField(auto_now_add=True, verbose_name="发布时间")
category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name="分类")
tag = models.ManyToManyField(Tag, blank=True, verbose_name="标签") class Meta:
verbose_name = "文章"
verbose_name_plural = verbose_name def __str__(self):
return u'%s' % self.title

修改app名显示

app名-table名-字段名

- app01/__init__.py
default_app_config = "app01.apps.App01Config" - apps.py
class App01Config(AppConfig):
name = 'app01'
verbose_name = u"文章"

注册app下的table到后台

list_display list_filter search_fields

from django.contrib import admin
from .models import Category, Tag, Post # Register your models here. class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'creat_time') #后台展示这些列 class TagAdmin(admin.ModelAdmin):
list_display = ('name', 'creat_time') class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'publish_time', 'category') #后台展示这些列
list_filter = ('category',) # 分类筛选
search_fields = ('title', 'slug', 'content',)#后台索引这些字段搜索 #注册app
admin.site.register(Category, CategoryAdmin)
admin.site.register(Tag, TagAdmin)
admin.site.register(Post, PostAdmin)

list_filter字段是外键的情况写法 字段名__外键

todo:

select_related和prefetch_related的区别

链式关系逻辑栗子1: 课程-章节-视频: 还有一种是链式的一对多关系

譬如 course里有多个章节, 一个章节lesson里有多个,一个lesson里有多个video

from datetime import datetime

from django.db import models

# Create your models here.

class Courses(models.Model):
name = models.CharField(max_length=50, verbose_name="课程名")
desc = models.CharField(max_length=300, verbose_name="课程描述")
detail = models.TextField(verbose_name="课程详情")
degree = models.CharField(choices=(("cj", "初级"), ('ZJ', "中级"), ("GJ", "高级")), verbose_name="课程等级")
learn_times = models.IntegerField(default=0, verbose_name="学习时长(分钟)")
students = models.IntegerField(default=0, verbose_name="学习人数")
fav_nums = models.IntegerField(default=0, verbose_name="收藏人数")
image = models.ImageField(max_length=100, upload_to="courses/%Y/%m/", verbose_name="封面图")
click_nums = models.IntegerField(default=0, verbose_name="点击数")
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta:
verbose_name = "课程"
verbose_name_plural = verbose_name class Lesson(models.Model):
course = models.ForeignKey(Courses, verbose_name="课程") # 看在哪个表添加外键,就看我需要你,就在我里面添加ForeignKey
name = models.CharField(max_length=100, verbose_name="章节名")
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta:
verbose_name = "章节"
verbose_name_plural = verbose_name class Video(models.Model):
lesson = models.ForeignKey(Lesson, verbose_name="章节")
name = models.CharField(max_length=100, verbose_name="章节名称")
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta:
verbose_name = "视频"
verbose_name_plural = verbose_name class CourseResourse(models.Model):
course = models.ForeignKey(Courses, verbose_name="课程名")
name = models.CharField(max_length=100, verbose_name="资源名称")
download = models.FileField(upload_to="course/resource/%Y/%m", verbose_name="资源文件下载地址", max_length=100)
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta:
verbose_name = "课程资源"
verbose_name_plural = verbose_name

链式关系逻辑栗子2: 城市-课程机构-教师

城市-课程机构-教师

两种为模型添加时间字段的方法

- 方法1,用自带的auto_now_add
class Category(models.Model):
name = models.CharField(max_length=20, verbose_name="分类")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间") - 方法2,用py模块
class Article(models.Model):
title = models.CharField(max_length=50, verbose_name="标题")
content = models.TextField(verbose_name="内容")
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

继续定制admin页面

list_editable: 修改数据

class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'category', 'add_time', ]
search_fields = ['title', 'category', ]
list_filter = ['title', 'category', 'add_time', ] list_display_links = None # 必须有这个,否则报错: # which cannot be used unless 'list_display_links' is set.
list_editable = ['title', 'category', ]

参考



加上后方便编辑数据了:

filter_horizontal = ['tag', ]

支持分页了

class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'category', 'add_time', ]
search_fields = ['title', 'category', ]
list_filter = ['title', 'category', 'add_time', ]
list_display_links = None
list_editable = ['title', 'category', ]
filter_horizontal = ['tag', ]
list_per_page = 2

支持排序了

class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'category', 'add_time', ]
search_fields = ['title', 'category', ]
list_filter = ['title', 'category', 'add_time', ]
list_display_links = None
list_editable = ['title', 'category', ]
filter_horizontal = ['tag', ]
list_per_page = 2
ordering = ('-add_time',) # 这里我逆序排列

[py]django的manytomany字段和后台搜索过滤功能的更多相关文章

  1. YII关联字段并带搜索排序功能

    1.简介 从接触yii框架到现在已经快有两个月了,但是自己对yii框架的了解程度并不是很深,并没有系统地去学习,仅仅只是在做项目的时候遇到不懂得知识才去翻手册. 在上一个项目中因为需要将关联的表的字段 ...

  2. DRF:过滤&搜索&排序功能

    过滤功能利用的是第三方包 django_filters,搜索和排序利用的是 Django DRF 提供的 filters 示例代码如下: from rest_framework import filt ...

  3. 在使用django admin的后台搜索时报错

    在使用django admin的后台搜索时报错 百度说在search_fields中定义了非字符串字段,最后发现author引用了外键 解决办法: 有外健时应写成: 本表外键字段__外键所在表所需要查 ...

  4. Django之model admin自定义后台管理

    Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 比如,数据表如下: from django.db ...

  5. Django ormmodel模型字段参考文章

    Model 字段参考 (Model field reference)¶ 本文档包含所有 字段选项 (field options) 的内部细节和 Django 已经提供的 field types . 参 ...

  6. django学习-19.admin管理后台的配置和登录

    目录结构 1.前言 2.admin管理后台的配置和登录的完整操作流程 2.1.第一步: 在[settings.py]里对常量[INSTALLED_APPS]的值进行相关配置 2.2.第二步: 在[ur ...

  7. Django的Many-to-Many(多对多)模型

      Django的Many-to-Many(多对多)模型 日期:2012-05-05 |  来源:未知 |  作者:redice |  人围观 |  1 人鼓掌了! 鲲鹏Web数据抓取 - 专业Web ...

  8. 四、Django之模型与管理后台-Part 2

    一.数据库安装 打开mysite/settings.py配置文件,这是整个Django项目的设置中心.Django默认使用SQLite数据库,因为Python源生支持SQLite数据库,所以你无须安装 ...

  9. django项目后台权限管理功能。

    对后台管理员进行分角色,分类别管理,每个管理员登录账号后只显示自己负责的权限范围. 创建后台管理数据库 models.py文件内 # 管理员表 class Superuser(models.Model ...

随机推荐

  1. mysql优化方法积累

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  2. 安装Phoenix时./sqlline.py执行报错File "./sqlline.py", line 27, in <module> import argparse ImportError: No module named argparse解决办法(图文详解)

    不多说,直接上干货! 前期博客 Apache版Phoenix的安装(图文详解) 问题现象 Traceback (most recent call last): File , in <module ...

  3. centos6.5 开发环境部署(nignx1.7.10+php5.4.38+mysql+ftp)

    一些命令和规则以及准备 本次流程再 DigitalOcean上的vps上通过 查看是否已经安装 rpm -qa | grep nginx 删除安装 #普通删除模式 rpm -e nginx #强力删除 ...

  4. 如何调用别人发布的WebService程序

    这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料   V ...

  5. python使用sqlalchemy连接pymysql数据库

    python使用sqlalchemy连接mysql数据库 字数833 阅读461 评论0 喜欢1 sqlalchemy是python当中比较出名的orm程序. 什么是orm? orm英文全称objec ...

  6. Effective C++ —— 杂项讨论(九)

    条款53 : 不要轻忽编译器的警告 请记住: 1. 严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉. 2. 不要过度倚赖编译器的报警能力,因为不同的编 ...

  7. Android 使用ProgressBar实现进度条

    ProgressBar简介ProgressBar是进度条组件,通常用于向用户展示某个耗时操作完成的进度,而不让用户感觉是程序失去了响应,从而更好地提升用户界面的友好型. 课程目标(1)制定Progre ...

  8. Eclipse版GoogleI/O2014开源项目

    https://github.com/google/iosched谷歌原版是Gradle工程,用Eclipse开发的导入不了,所以搞了一个Elicpse工程,依赖的jar.库比较多,也比较难找... ...

  9. 【Mysql】大数据处理优化方法

    1.应尽量避免在 where 子句中使用 != 或  <>  操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orde ...

  10. SQL 根据日期精确计算年龄

    SQL 根据日期精确计算年龄 第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birt ...