Как я могу найти самое новое соответствие для всех имен в модели Django? - PullRequest
3 голосов
/ 02 февраля 2012

У меня есть модель Django, которая выглядит так:

class MyModel(Model):
    name = CharField(...)
    version = IntegerField(...)
    other_stuff = ...

    unique_together = ('name', 'version')

Я хочу иметь возможность запрашивать все самые последние версии каждого имени, но опуская все более старые версии для любого данного имени.

Возможно ли это с моделями Django? Если так, то как бы это выглядело?

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

Я не уверен, что вы можете сделать это прямо сейчас с помощью функций агрегирования Django ORM. Во всяком случае, я думаю, что эта структура кричит моделирование, как это:

class MyModel(Model):
    name = CharField(...)
    some_stuff = ...

class Version(Model):
    number = IntegerField(...)
    my_model = ForeignKey(MyModel, ...)
    other_stuff = ...

Таким образом, вы можете сделать это, чтобы получить новейшую версию каждого MyModel:

>>> from django.db.models import Max
>>> MyModel.objects.annotate(highest_version = Max('version__number'))
1 голос
/ 02 февраля 2012

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

Обновление : кажется, я правильно понял код, но хотя онработать для вашего конкретного случая Я пока не знаю, как получить другие поля в том же запросе (предположим, что вы хотели не только номера версий, но и другие вещи - это решение не будет работать):

from django.db.models import Max
MyModel.objects.values('name').annotate(Max('version'))

# Will return something like:
# [{'name':'a', 'version__max':3}, {'name':'b', 'version__max':2}, ...]

Если вы используете Django 1.4 и PostgreSQL, вы можете сделать это, используя отличный метод:

MyModel.objects.order_by('name', '-version').distinct('name')
...