您好,登錄后才能下訂單哦!
如圖,對(duì)文章進(jìn)行歸類(lèi)后,在首頁(yè)的左面會(huì)出現(xiàn)一個(gè)分類(lèi)列表,以及么個(gè)分類(lèi)對(duì)應(yīng)的文章數(shù)目
modles.py中對(duì)應(yīng)的數(shù)據(jù)庫(kù)關(guān)系如下
class Article(models.Model):
nid = models.BigAutoField(primary_key=True)
title = models.CharField(verbose_name='文章標(biāo)題',max_length=128)
summary = models.CharField(verbose_name='文章簡(jiǎn)介',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='創(chuàng)建時(shí)間',auto_now_add=True)
blog=models.ForeignKey(verbose_name='所屬博客',to='Blog',to_field='nid',on_delete=models.CASCADE,)
category = models.ForeignKey(verbose_name='所屬分類(lèi)',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='個(gè)人博客標(biāo)題',max_length=64)
site = models.CharField(verbose_name='個(gè)人博客前綴',max_length=32,unique=True)
theme = models.CharField(verbose_name='個(gè)人博客主題',max_length=32)
user = models.OneToOneField(to='UserInfo',to_field='nid',on_delete=models.CASCADE,)
class Category(models.Model):
"""
博主個(gè)人文章分類(lèi)表
"""
nid = models.AutoField(primary_key=True)
title = models.CharField(verbose_name='分類(lèi)標(biāo)題',max_length=32)
blog = models.ForeignKey(verbose_name='所屬博客',to='Blog',to_field='nid',on_delete=models.CASCADE,)
當(dāng)用戶輸入了博客后綴后,通過(guò)后綴列出的,當(dāng)前用戶的分類(lèi)信息
def home(request,site):
blog = models.Blog.objects.filter(site=site).first()
if not blog:
return redirect('/')
#當(dāng)前博客的所有文章
models.Article.objects.filter(blog=blog)#這里可以傳入blog對(duì)象,也可以通過(guò)blog__id=blog.id的方式來(lái)過(guò)濾
#當(dāng)前所有博客的分類(lèi)
# cate_list = models.Category.objects.filter(blog=blog)
# for item in cate_list:
# c = item.article_set.all().count()#通過(guò)反向查找每個(gè)類(lèi)對(duì)應(yīng)的所有文章的個(gè)數(shù)
# print(item,c)
#但是上面的這個(gè)方法不好,他對(duì)數(shù)據(jù)庫(kù)的操作比較多,我們可以使用下面的一次性查出來(lái),通過(guò)一條來(lái)操作
#下面的一條分類(lèi)語(yǔ)法,
# 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='標(biāo)簽名稱(chēng)',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='文章標(biāo)題',max_length=128)
summary = models.CharField(verbose_name='文章簡(jiǎn)介',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='創(chuàng)建時(shí)間',auto_now_add=True)
blog=models.ForeignKey(verbose_name='所屬博客',to='Blog',to_field='nid',on_delete=models.CASCADE,)
category = models.ForeignKey(verbose_name='所屬分類(lèi)',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='標(biāo)簽', to="Tag", to_field='nid',on_delete=models.CASCADE,)
class Meta:
unique_together = [
('article', 'tag'),
]
views處理結(jié)果
#tag標(biāo)簽分類(lèi)
tag_list = models.Tag.objects.filter(blog=blog)
for item in tag_list:
c= item.article_set.all().count()
print(item,c)
##上面的這種方法還是讀取數(shù)據(jù)庫(kù)次數(shù)多
#方法一
from django.db.models import Count
models.Article.objects.filter(blog=blog).values('blog_id','tags__title').annotate(c=Count('nid'))
#方法二
##通過(guò)manytomany來(lái)關(guān)聯(lián)
# models.Article2Tag.objects.values('article_id','tag_id','article__title','tag__title')#通過(guò)一張表就關(guān)聯(lián)了三張表
#方法三:有第三張表的前的情況
models.Article2Tag.objects.filter(tag__blog=blog).values('tag_id','tag__title').annotate(c=Count('id'))#這個(gè)是獲取某個(gè)博客關(guān)聯(lián)的文章id和tagid的關(guān)系
#article_id tag_id
# 1 1
# 1 2
# 2 12
##方法四:如果沒(méi)有第三張表,只是many2many自動(dòng)生成的表,通過(guò)下面的方法就可以連表
models.Article.objects.filter(blog=blog).values('nid','title','tags','tags__title').annotate(c=Count('nid'))#這里加了一個(gè)tags就把前2個(gè)表
#聯(lián)系到了一起,簡(jiǎn)歷一個(gè)關(guān)系表
方法四,需要把tags里面的through去掉,把手動(dòng)創(chuàng)建的第三張表去掉。然后來(lái)操作
發(fā)現(xiàn)原生sql很好來(lái)寫(xiě),但是django要怎么做?
%這個(gè)字符在python中格式字符串的時(shí)候,是不能保留的,如要要保留需要%%兩個(gè)。專(zhuān)業(yè)就可以得到100%這樣的,所以對(duì)于上面的年月,我們可以“%%Y-%%m”這樣在python格式化完后,數(shù)據(jù)庫(kù)之間就可以%Y這樣了
sqlite的寫(xiě)法是這樣
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。