[py]django的manytomany字段和后台搜索过滤功能

我本来想搞下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',)  # 这里我逆序排列

原文地址:https://www.cnblogs.com/iiiiiher/p/8441424.html