После обратной связи и аннотирования результатов - PullRequest
1 голос
/ 15 декабря 2010

Скажем, у меня есть пара моделей, одна связана с другой через внешний ключ, например:

class Tourist(models.Model):
    age = models.IntegerField()

class Country(models.Model):
    tourist = models.ForeignKey(Tourist)

Я знаю, что могу поработать с Туристом в обратном направлении, чтобы выяснить, сколько стран он использует:

t = Tourist.objects.all()[0]
t.country_set.count()

Но есть ли способ аннотировать количество стран, которые посетил турист? Было бы здорово, если бы я мог сделать что-то вроде

Tourist.objects.annotate(countries_visited=country_set.count())

Я знаю, что последний бит "кода" там не имеет смысла, но я рассчитываю на то, что он передаст желания моего сердца. Я знаю, что могу сделать что-то вроде этого:

[(t.pk, t.country_set.count()) for t in Tourist.objects.all()]

Но мне просто интересно, есть ли лучший способ сделать это. Спасибо!

1 Ответ

2 голосов
/ 15 декабря 2010

Вы уже довольно близко.

from django.db.models import Count

Tourist.objects.annotate(countries_visited=Count('country'))

делает то, что вы хотите, даже если вы следите за отношениями в обратном направлении.

...