Как считать подкатегории в Django? - PullRequest
0 голосов
/ 12 января 2020

У меня есть модель с именем Topi c и проблема:

class Topic(models.Model):
    name = models.CharField(max_length = 250, unique = True)
    slug = models.CharField(max_length = 250, unique = True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'Topic'
        verbose_name_plural = 'Topics'

    def get_url(self):
        return reverse('problemdirectory', args = [self.slug])

    def __str__(self):
        return self.name

class Problem(models.Model):
    slug = models.CharField(max_length = 250, unique = True)
    topic = models.ForeignKey(Topic, on_delete = models.CASCADE)

    questionToProblem = models.TextField()
    solutionToProblem = models.TextField()

    class Meta:
        ordering = ('questionToProblem',)

    def get_url(self):
        return reverse('solution_details', args = [self.topic.slug, self.slug])

    def __str__(self):
        return self.questionToProblem

Topi c похожа на «папку» или категорию для проблемы. Как бы подсчитать количество проблем, которые есть у Topi c в views.py, и сослаться на него в шаблоне HTML:

def topicList(request):
    topics = Topic.objects.all()
    #numberOfProblems = Problem.objects.count()
    Problem.objects.filter(topic__name= topic).count()
    topics.order_by('name')

    return render(request, 'topiclist.html', {'topics': topics})

Я попытался импортировать Q и filter () без успех до сих пор.

Ответы [ 3 ]

2 голосов
/ 12 января 2020

А как насчет вычисляемого поля в Topic классе?

class Topic(models.Model):
    name = models.CharField(max_length = 250, unique = True)
    slug = models.CharField(max_length = 250, unique = True)

    @property
    def problem_count(self):
        return Problem.objects.filter(topic = self).count()

Тогда оно будет доступно в вашей topics переменной

def topicList(request):
    topics = Topic.objects.all().order_by('name')    
    return render(request, 'topiclist.html', {'topics': topics})
0 голосов
/ 12 января 2020

Добавьте related_name следующим образом.

class Problem(models.Model):
   slug = models.CharField(max_length = 250, unique = True)
   topic = models.ForeignKey(Topic, related_name="problems", on_delete = models.CASCADE)

И добавьте метод свойства в Topic модель, подобную этой -

class Topic(models.Model):
   name = models.CharField(max_length = 250, unique = True)
   slug = models.CharField(max_length = 250, unique = True)

   @property
   def total_problems(self):
       return self.problems.all().count()

Теперь вы можете получить общее количество проблемы с каждой топи c следующим образом.

topics = Topic.objects.all()
for topic in topics:
    total_problems = topic.total_problems

Вы можете показать количество проблем в своих шаблонах внутри a для l oop следующим образом.

{{topic.total_problems}}
0 голосов
/ 12 января 2020
from django.db.models import Count
def topicList(request):
    topics = Topic.objects.all().annotation(problem_count=Count('topic_set'))
    #numberOfProblems = Problem.objects.count()
    Problem.objects.filter(topic__name= topic).count()
    topics.order_by('name')

    return render(request, 'topiclist.html', {'topics': topics})
...