Аннотировать запрос Django через обратную связь - PullRequest
3 голосов
/ 30 июля 2010

У меня есть две модели Property и Image, связанные внешним ключом, так что у каждого Property есть несколько экземпляров Image.Я пытаюсь получить набор запросов всех свойств - список всех полей - и количество изображений, которые имеет каждое свойство.Мне известно, что я мог бы сделать это как два разных запроса, но я не чувствую, что это особенно элегантный подход, и он оказывается немного неэффективным, поскольку эта информация извлекается через XMLHttpRequest.

Моделиопределены следующим образом:

class Property(models.Model):
    title = models.CharField('title', max_length=255)
    created = models.DateTimeField('created', auto_now_add=True)
    modified = models.DateTimeField('modified', auto_now=True)

    class Meta:
        pass


class Image(models.Model):
    prop_id = models.ForeignKey(Property)
    image_file = models.ImageField('image file', upload_to='/path/to/image/')

    class Meta:
        pass

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

Спасибо за любую помощь, которую кто-либо может предложить.

РЕДАКТИРОВАТЬ:

Я выполнил запрос:

Property.objects.all().annotate(image_count=Count('image')).order_by('-image_count')

РЕДАКТИРОВАТЬ 2:

После некоторых экспериментов я нашел решение, хотя я почти уверен, что это квалифицируется как ошибка / недокументированная проблема:

Property.objects.all().annotate(Count('image')).order_by('-image__count')
Property.objects.all().annotate(total_images=Count('image')).order_by('-total_images')

Они оба работают, но именование аннотации image_count не работает.Не углубляясь в источник Django, я не могу по-настоящему размышлять о том, почему это происходит.

1 Ответ

1 голос
/ 30 июля 2010

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

Глупый вопрос, но вы уверены, что в базе данных есть элементы Property?

...