Переписать «SELECT DISTINCT ON ...» с помощью ORM Джанго - PullRequest
3 голосов
/ 19 сентября 2010

Я использую следующую модель с Django:

class Hit(Model):
    image = ForeignKey(Image)
    user = ForeignKey(User)
    timestamp = DateTimeField(auto_now_add = True)

Мне нужен в основном список, содержащий количество «первых обращений» (то есть совпадений без более ранней отметки времени для того же изображения) для каждого пользователя, чтобы создать сортировку списка рангов.

Или, что еще проще, просто список, содержащий имя пользователя один раз для каждого «первого попадания» этого пользователя.

В SQL, использующем расширение PostgreSQL "DISTINCT ON", это будет простой запрос, подобный:

SELECT DISTINCT ON (image_id) user_id FROM proj_hit ORDER BY image_id ASC, timestamp ASC;

Есть ли способ получить этот результат с помощью ORM Django или (по крайней мере) переносимого SQL, т. Е. Без расширений PostgreSQL?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2010

Вы можете внести изменения в свою модель?Это поможет отменить нормализацию и сохранить информацию о первом попадании в той же модели или в составе другой модели.

Например,

class Hit(Model):
    image = ForeignKey(Image)
    user = ForeignKey(User)
    timestamp = DateTimeField(auto_now_add = True)
    is_first_hit = BooleanField(default = False)

Затем можно переопределить метод save() (или коснуться сигнала), чтобы явно указать is_first_hit при сохранении.Это сделало бы вставки и обновления немного дороже, но сделало бы запрос очень простым.

0 голосов
/ 19 сентября 2010

Я почти уверен, что портативная версия SQL очень похожа на версию, которую вы опубликовали - просто отбросьте ON:

SELECT DISTINCT image_id, user_id FROM proj_hit ORDER BY image_id ASC, timestamp ASC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...