Подсчет количества записей в связанной таблице - обход по кругу - PullRequest
1 голос
/ 30 сентября 2019

Я просмотрел около 50 вопросов о переполнении стека, а также многочисленные статьи в Google, но у меня болит голова, и я просто не понимаю этого.

У меня есть следующие таблицы и поля базы данных:

Cases:
--id
--Name

Information:
--id
--case_id
--detail

Я хочу подсчитать, сколько информационных записей существует для каждого случая.

Итак,код psuedo это будет что-то вроде:

SELECT COUNT(*) FROM Information WHERE case_id=id

или подобное. Мой желаемый вывод выглядит примерно так:

Дело № 1 содержит 43 записи информации. Дело № 2 содержит 16 записей информации. Дело № 3 имеет 8 записей информации

и т. Д. *

Я пытался в основном использовать функцию аннотирования в django, а затем указывать внешние ключи в файле models.py.

Мне кажется, что я запутался, поскольку сейчас я пробовал много вещей.

views.py:

def cases(request):
    #didnt work - number = Cases.objects.annotate(Count('id'))

    #didn't work - questions = Information.objects.annotate(number_of_information_records=Count('id'))


    #didn't work - results = Information.objects.annotate(number_of_information_records=Count((Case(When(Cases.id == Information.case_id), output_field=IntegerField()))))

models.py:

class Cases(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    name = models.CharField(db_column='Case_Name', max_length=255)  # Field name made lowercase.

    ##this was an attempt to get it to work
    ##information = models.ForeignKey("Information", on_delete=models.CASCADE, db_column="id")

    def __str__(self):
        return self.name

    class Meta:
        managed = False
        db_table = 'Cases'
        verbose_name_plural = "Cases"

class Information(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    case_id = models.IntegerField(db_column='Case_ID', blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Information'
        verbose_name_plural = "Information"

Код просто не работает, он часто запускается без ошибок, но ничего не выводится или выводит простообъекты без детализации я хочу.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Я думаю, что вы можете попробовать это, используя count:

Information.objects.filter(case_id=your_case_id).count()
0 голосов
/ 30 сентября 2019

IIUC:

from django.db.models import Count, Q

Information.objects.filter(case_id='foo'
).annotate(case_count=Count('case_id', filter=Q(case_id='foo'))

Получил этот ответ из документов

Дайте мне знать, если это не сработает.

...