个人主页的分类操作

主页分类操作

需求


如图,对文章进行归类后,在首页的左面会出现一个分类列表,以及么个分类对应的文章数目
modles.py中对应的数据库关系如下

class Article(models.Model):
    nid = models.BigAutoField(primary_key=True)
    title = models.CharField(verbose_name=‘文章标题‘,max_length=128)
    summary = models.CharField(verbose_name=‘文章简介‘,max_length=255)
    read_count = models.IntegerField(default=0)
    comment_count = models.IntegerField(default=0)
    up_count= models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)
    create_time = models.DateTimeField(verbose_name=‘创建时间‘,auto_now_add=True)

    blog=models.ForeignKey(verbose_name=‘所属博客‘,to=‘Blog‘,to_field=‘nid‘,on_delete=models.CASCADE,)
    category = models.ForeignKey(verbose_name=‘所属分类‘,to=‘Category‘,to_field=‘nid‘,null=True,on_delete=models.CASCADE,)
    type_choices = [
        (1, "Python"),
        (2, "Linux"),
        (3, "OpenStack"),
        (4, "GoLang"),
    ]
    article_type_id = models.IntegerField(choices=type_choices, default=None)

    tags = models.ManyToManyField(
        to="Tag",
        through=‘Article2Tag‘,
        through_fields=(‘article‘, ‘tag‘),
    )

class Blog(models.Model):
    """
    博客信息
    """
    nid = models.BigAutoField(primary_key=True)
    title = models.CharField(verbose_name=‘个人博客标题‘,max_length=64)
    site = models.CharField(verbose_name=‘个人博客前缀‘,max_length=32,unique=True)
    theme = models.CharField(verbose_name=‘个人博客主题‘,max_length=32)
    user = models.OneToOneField(to=‘UserInfo‘,to_field=‘nid‘,on_delete=models.CASCADE,)
class Category(models.Model):
    """
    博主个人文章分类表
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name=‘分类标题‘,max_length=32)
    blog = models.ForeignKey(verbose_name=‘所属博客‘,to=‘Blog‘,to_field=‘nid‘,on_delete=models.CASCADE,)

当用户输入了博客后缀后,通过后缀列出的,当前用户的分类信息

def home(request,site):
    blog = models.Blog.objects.filter(site=site).first()
    if not blog:
        return redirect(‘/‘)

    #当前博客的所有文章
    models.Article.objects.filter(blog=blog)#这里可以传入blog对象,也可以通过blog__id=blog.id的方式来过滤

    #当前所有博客的分类
    # cate_list = models.Category.objects.filter(blog=blog)
    # for item in cate_list:
    #     c = item.article_set.all().count()#通过反向查找每个类对应的所有文章的个数
    #     print(item,c)
    #但是上面的这个方法不好,他对数据库的操作比较多,我们可以使用下面的一次性查出来,通过一条来操作

    #下面的一条分类语法,
    # from django.db.models import Count
    # category_list = models.Article.objects.filter(blog=blog).values(‘category_id‘,‘category__title‘).annotate(c=Count(‘nid‘))
    # for title,conut in category_list:
    #     print(title,count)
    #

标签分类

class Tag(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name=‘标签名称‘,max_length=32)
    blog = models.ForeignKey(verbose_name=‘所属博客‘,to=‘Blog‘,to_field=‘nid‘,on_delete=models.CASCADE,)

class Article(models.Model):
    nid = models.BigAutoField(primary_key=True)
    title = models.CharField(verbose_name=‘文章标题‘,max_length=128)
    summary = models.CharField(verbose_name=‘文章简介‘,max_length=255)
    read_count = models.IntegerField(default=0)
    comment_count = models.IntegerField(default=0)
    up_count= models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)
    create_time = models.DateTimeField(verbose_name=‘创建时间‘,auto_now_add=True)

    blog=models.ForeignKey(verbose_name=‘所属博客‘,to=‘Blog‘,to_field=‘nid‘,on_delete=models.CASCADE,)
    category = models.ForeignKey(verbose_name=‘所属分类‘,to=‘Category‘,to_field=‘nid‘,null=True,on_delete=models.CASCADE,)
    type_choices = [
        (1, "Python"),
        (2, "Linux"),
        (3, "OpenStack"),
        (4, "GoLang"),
    ]
    article_type_id = models.IntegerField(choices=type_choices, default=None)

    tags = models.ManyToManyField(
        to="Tag",
        through=‘Article2Tag‘,
        through_fields=(‘article‘, ‘tag‘),
    )

class Article2Tag(models.Model):
    article = models.ForeignKey(verbose_name=‘文章‘, to="Article", to_field=‘nid‘,on_delete=models.CASCADE,)
    tag = models.ForeignKey(verbose_name=‘标签‘, to="Tag", to_field=‘nid‘,on_delete=models.CASCADE,)

    class Meta:
        unique_together = [
            (‘article‘, ‘tag‘),
        ]

views处理结果

#tag标签分类
    tag_list = models.Tag.objects.filter(blog=blog)
    for item in tag_list:
        c= item.article_set.all().count()
        print(item,c)
    ##上面的这种方法还是读取数据库次数多
    #方法一
    from django.db.models import Count
    models.Article.objects.filter(blog=blog).values(‘blog_id‘,‘tags__title‘).annotate(c=Count(‘nid‘))
    #方法二
    ##通过manytomany来关联
    # models.Article2Tag.objects.values(‘article_id‘,‘tag_id‘,‘article__title‘,‘tag__title‘)#通过一张表就关联了三张表

    #方法三:有第三张表的前的情况
    models.Article2Tag.objects.filter(tag__blog=blog).values(‘tag_id‘,‘tag__title‘).annotate(c=Count(‘id‘))#这个是获取某个博客关联的文章id和tagid的关系
    #article_id     tag_id
    #   1           1
    #   1           2
    #   2           12

    ##方法四:如果没有第三张表,只是many2many自动生成的表,通过下面的方法就可以连表
    models.Article.objects.filter(blog=blog).values(‘nid‘,‘title‘,‘tags‘,‘tags__title‘).annotate(c=Count(‘nid‘))#这里加了一个tags就把前2个表
    #联系到了一起,简历一个关系表

方法四,需要把tags里面的through去掉,把手动创建的第三张表去掉。然后来操作

时间分类


发现原生sql很好来写,但是django要怎么做?

%这个字符在python中格式字符串的时候,是不能保留的,如要要保留需要%%两个。专业就可以得到100%这样的,所以对于上面的年月,我们可以“%%Y-%%m”这样在python格式化完后,数据库之间就可以%Y这样了

sqlite的写法是这样

原文地址:http://blog.51cto.com/sgk2011/2097016

时间: 2024-07-31 23:05:38

个人主页的分类操作的相关文章

文件夹分类操作

import os import shutil vpath = "H:/v3/b/" fobj = open('H:/v3/a.txt','rb') line = fobj.readline() while line: line = line.strip('\r\n') filepath = line.split('\t')[-1] filepath = filepath.strip(' ') sha1 = filepath.split('\\')[-1] foldname = lin

Css常用操作——————分类

一.尺寸操作 height    设置元素高度 line-height    设置行高 .p1{     width: 400px;     line-height: normal; } .p2{     width: 400px;     line-height: 200%; } .p3{     width: 400px;     line-height: 50%; } <!DOCTYPE html> <html lang="en"> <head>

CSS3常用操作

对齐操作 使用margin属性进行水平对齐 使用position属性进行左右对齐 使用float属性进行左右对齐 尺寸操作的属性 height 设置元素高度 line-height 设置行高 max-height 设置元素最大高度 max-width 设置元素最大宽度 min-width 设置元素最小宽度 min-height 设置元素最小高度 width 设置元素宽度 分类操作的属性 clear 设置一个元素的侧面是否允许其他的浮动元素 cursor 规定当鼠标指向某元素之上时显示的指针类型

模式识别:分类回归决策树CART的研究与实现

摘 要:本实验的目的是学习和掌握分类回归树算法.CART提供一种通用的树生长框架,它可以实例化为各种各样不同的判定树.CART算法采用一种二分递归分割的技术,将当前的样本集分为两个子样本集,使得生成的决策树的每个非叶子节点都有两个分支.因此,CART算法生成的决策树是结构简洁的二叉树.在MATLAB平台上编写程序,较好地实现了非剪枝完全二叉树的创建.应用以及近似剪枝操作,同时把算法推广到多叉树. 一.技术论述 1.非度量方法 在之前研究的多种模式分类算法中,经常会使用到样本或向量之间距离度量(d

算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification) 0.写在前面的话 我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比的美感.而每次将学过的算法应用到实际中,并解决了实际问题后,那种快感更是我在其它地方体会不到的. 一直想写关于算法的博文,也曾写过零散的两篇,但也许是相比于工程性文章来说太小众,并没有引起大家的兴趣.最近面临毕业找工作,为了能给自己增加筹码,决定再次复习算法方面的知识,我决定趁这个机会,写一系列关于

Windows Server 2012文件服务器资源管理器(FSRM)(1)---配置文件分类

什么是FSRM? FSRM可以对存储在文件服务器上的数据进行管理和分类.FSRM包含以下的功能: 1.文件分类基础架构.此功能可以自动执行文件分类操作.你可以基于文件的分类去动态的设置文件访问策略.使用FSRM可以让文件的属性根据应用程序类型或者文件内容自动修改,或者通过在服务器上手动配置的选项来触发文件分类. 2.文件管理任务.此功能可以基于文件的分类应用一个包含条件的策略或者动作.文件管理任务的条件包括:文件位置,分类属性,文件中的数据,上次修改文件的日期,上次访问文件的时间.文件管理任务的

PHP实现无限极分类的两种方式

无限极分类说简单点就是一个类可以分成一个分子类,然后一个子类又可以分另一个子类这样无限分下去,就是好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一个文件夹,PHP要实现无限极分类有两种常用的做法,递归和引用算法. 数据表(两种实现方式都是一样的数据表): 建数据表的时候,增加一个字段(一般用pid作为字段名)用来区别自己所属的分类,字段值为其父级的主键id,0为一级分类. 1.引用算法: (1)获取一级分类 获取pid为0的数据,返回给模板,循环展示. 循环展示新增id属性,其

Update:sparksql:第3节 Dataset (DataFrame) 的基础操作 &amp; 第4节 SparkSQL_聚合操作_连接操作

8. Dataset (DataFrame) 的基础操作 8.1. 有类型操作 8.2. 无类型转换 8.5. Column 对象 9. 缺失值处理 10. 聚合 11. 连接 8. Dataset (DataFrame) 的基础操作 导读 这一章节主要目的是介绍 Dataset 的基础操作, 当然, DataFrame 就是 Dataset, 所以这些操作大部分也适用于 DataFrame 有类型的转换操作 无类型的转换操作 基础 Action 空值如何处理 统计操作 8.1. 有类型操作 分

python 读写txt文件并用jieba库进行中文分词

python用来批量处理一些数据的第一步吧. 对于我这样的的萌新.这是第一步. #encoding=utf-8 file='test.txt' fn=open(file,"r") print fn.read() fn.close() 在控制台输出txt文档的内容,注意中文会在这里乱码.因为和脚本文件放在同一个地方,我就没写路径了. 还有一些别的操作. 这是文件open()函数的打开mode,在第二个参数中设置.特别需要注意一下.具体还有一些别的细节操作. http://www.jb51