[英]Context processor for filter empty categories
在我的博客中,帖子是根據類別划分的。 我已經從類別列表中排除了名為 Uncategorized 的類別,現在我想排除空的類別。
進入 context_processor 我有下面的查詢工作正常:
MyCategory.objects.exclude(category_name="Uncategorized")
我試過這樣的查詢:
def myblog_menu(request):
myblog_menu_link = MyCategory.objects.exclude(category_name="Uncategorized").filter(category_name__category_set__isnull=True)
return {
'myblog_menu_link': myblog_menu_link,
}
但我看到這個錯誤:
不受支持的 CharField 查找“category_set”或不允許在該字段上加入。
我該如何解決?
模型.py
class MyCategory(models.Mode):
category_name = models.CharField(...)
.
.
:
class BlogPost(models.Mode):
title = models.CharField(...)
category = models.ForeignKey(MyCategory, related_name="category_set", ....)
.
.
:
您可以排除空的類別:
MyCategory.objects.exclude(
category_name='Uncategorized'
).filter(
category_set__isnull=False
).distinct()
這將因此生成一個查詢,如下所示:
SELECT DISTINCT mycategory.*
FROM mycategory
INNER JOIN blogpost ON mycategory.id = blogpost.category_id
WHERE NOT (mycategory.category_name = 'Uncategorized')
AND blogpost.id IS NOT NULL
因此,我們在這里指定如果我們使用BlogPost
進行LEFT OUTER JOIN
, BlogPost
它應該是空的。 這里的查詢是一個INNER JOIN
,這是一種優化,因為如果我們過濾掉可空值,那么很明顯我們不必首先生成那些。
話雖這么說,我強烈建議你改變related_name
您的category
外鍵blogpost_set
,或只是離開它,因為它是。 related_name
是對象的反向名稱,一個Category
沒有category_set
,它有一組blogposts
:
class BlogPost(models.Mode):
title = models.CharField(...)
category = models.ForeignKey(MyCategory, related_name='blogpost_set', ....)
在這種情況下,查詢是:
MyCategory.objects.exclude(
category_name='Uncategorized'
).filter(
blogpost_set__isnull=False
).distinct()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.