[英]Django model with Charfield Count and Zero values
我有一個 Django 數據庫 model 有一些屬性,其中之一是帶有選擇的 Charfield“類別”。 我現在想用每個類別的行數注釋這個 model 的查詢集。 問題是,我知道這樣做的方式,只有查詢集中存在的類別被計算在內,但我想要一個所有類別都用計數注釋的查詢集(如果沒有此類別的行,則為 0)。
這就是我目前正在做的事情:
Model.objects.all().values('category').annotate(total=Count('category'))
有沒有辦法顯示所有類別,包括計數為 0 的類別?
您不能計算不存在的類別,因為,嗯……這些不存在。 choices
甚至不會傳輸到數據庫。
使用帶有choices
的CharField
並不是理想的建模方式。 通常,最好先制作一個 model Category
,然后制作另一個MyModel
與ForeignKey
[Django-doc]將MyModel
object 鏈接到Category
,所以:
class Category(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class MyModel(models.Model):
category = models.ForeignKey(Category, on_delete=models.PROTECT)
然后我們可以創建如下類別:
Category.objects.bulk_create(
Category(name='technology'),
Category(name='art'),
Category(name='science')
)
如果我們然后將MyModel
對象鏈接到這些Category
,我們可以用MyModel
的數量注釋Category
:
from django.db.models import Count
Category.objects.annotate(
num_mymodel=Count('mymodel')
)
在這里,由此查詢集產生的Category
將具有一個額外的屬性.num_mymodel
,其中包含鏈接的MyModel
對象的數量。 由於執行了LEFT OUTER JOIN
,對於沒有任何MyModel
的Category
,它將使用0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.