• [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',)  # 这里我逆序排列
    

  • 相关阅读:
    jqueryautocomplete
    了解CSS的查找匹配原理 让CSS更简洁、高效
    html5网页编码
    刚开始学习 mvc碰到的郁闷问题
    datatable 批量插入方法 求解?
    28个经过重新设计的著名博客案例(1120)
    递归调用中的return
    C++新建一个模板
    C++ 中用 sizeof 判断数组长度
    为什么MySQL选择REPEATABLE READ作为默认隔离级别?
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/8441424.html
Copyright © 2020-2023  润新知