2012-02-02 1 views
3

У меня есть модель Джанго, которая выглядит следующим образом:Как найти новейшее соответствие для всех имен в модели Django?

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

    unique_together = ('name', 'version') 

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

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

ответ

1

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

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

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, вы может быть в состоянии сделать это, используя метод distinct:

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

Я не уверен, что вы можете сделать это сразу, только с функциями агрегации 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')) 
+0

Что бы это выглядело, как для моего случая использования? Можете ли вы показать мне, как я буду A) Перечислить все модели в их последних версиях, B) получить конкретную модель в любой версии, а C), где это будет «аннотировать»? –

Смежные вопросы