簡體   English   中英

用於過濾空類別的上下文處理器

[英]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 JOINBlogPost它應該是空的。 這里的查詢是一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM