Как считать вещи во внешнем ключе? - PullRequest
0 голосов
/ 20 сентября 2018

Я делаю приложение для блога, используя django ...

Это мой model.py

class categories(models.Model):
    Title = models.CharField(max_length=40)

class Blog(models.Model):
    User = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    Date = models.DateTimeField(default=datetime.now)
    Blog_title = models.CharField(max_length=255)
    likes = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='likes',blank=True)
    Description = RichTextUploadingField(blank=True, null=True,config_name='special')
    Blog_image = models.ImageField(upload_to='blog_image', null=True, blank=True)
    Category = models.ForeignKey(categories,on_delete=models.CASCADE,related_name='Categories')

Мне было интересно, как подсчитать общее количество блогов, не представленных для конкретногокатегория?

Я хочу отслеживать конкретную скорость счета для всех категорий ...

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018
[{"category_title":category.Title, "count":Blog.objects.filter(Category=category).count()} for category in categories.objects.all()]

Это даст список словарей с названием категории и соответствующими ей значениями

0 голосов
/ 20 сентября 2018

Вы также можете сделать с моделью категории.

Categories.objects.filter(Title="someName").Categories.all().count()
0 голосов
/ 20 сентября 2018

Если вы хотите посчитать количество Blog с на Category, мы можем сделать аннотацию для Category:

from django.db.models import Count

Category.objects.annotate(
    num_blogs=<b>Count(<s>'Categories'</s>)</b>
)

Но (как указано позже), используя categories поскольку связанное имя совершенно неверно и должно быть переименовано в blogs, поскольку это обратное отношение, в этом случае запрос выглядит так:

from django.db.models import Count

Category.objects.annotate(
    num_blogs=<b>Count(<s>'blogs'</s>)</b>
)

В результате получается QuerySet, содержащий все Category объектов и каждый Category объект будут иметь атрибут num_blogs, который содержит количество блогов, связанных с этой категорией.

Преимущество аннотаций состоит в том, что вы избегаете " N + 1 проблема ": здесь мы все еще выполняем один запрос, а не один запрос для категорий и n запросов для получения блогарассчитывать на эту конкретную категорию.В MySQL запрос будет выглядеть следующим образом:

SELECT category.*, COUNT(blog.id)
FROM category
LEFT OUTER JOIN blog ON blog.category_id = category.id
GROUP BY category.id

Примечание : обычно атрибуты в Python начинаются со строчной буквы (и используют подчеркивание между словами), поэтому blog_title иcategory вместо Blog_title и Category

Примечание : related_name - это имя, которое вы даете объектам обратное отношение, поэтому related_name из category = ForeignKey(..) должно быть 'blogs', а не 'categories'.

0 голосов
/ 20 сентября 2018
for title in categories.objects.all():
    Blog.objects.filter(Category__Title=a.title).count()

Это будет делать то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...