Фильтрация набора запросов в django для каждого типа записи - PullRequest
1 голос
/ 06 марта 2011

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

id | user_id (fk) | message
---+--------------+--------------
1  | 1            | hello!
2  | 5            | hey
3  | 1            | how are you?
4  | 5            | great!

Фильтрация по критериям, указанным выше, приведет к (1, 5)

Невозможно определить, какой метод использовать, или мне придется написатьчто-то мое.В любом случае, понимание будет оценено.

Ответы [ 2 ]

3 голосов
/ 06 марта 2011

При дальнейшем рассмотрении я определил, что ответом является функция distinct() применительно к набору запросов:

1 голос
/ 06 марта 2011

Если вы хотите получить доступ к экземпляру модели, а не только к внешним ключам, вы можете сделать что-то вроде:

from django.db.models import Max

# get the latest id for each user_id (most recent)
latest = Message.objects.values('user_id').annotate(id=Max('id'))
Message.objects.filter(id__in=[m['id'] for m in latest])

Это не так хорошо, как необработанный sql-эквивалент, поскольку возвращается выбор, а затем он используется в качестве основы для фильтра IN (). Это довольно медленно. Альтернативой является написание сырого SQL, и вам следует избегать этого.

-- here it is anyway

SELECT m.id, m.user_id, m.message
FROM Messages m
JOIN (
         SELECT user_id, max(id) as max_id
         FROM Messages
         GROUP BY user_id
     ) mm
ON m.id = mm.max_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...