Как я могу сделать запрос Django для первого вхождения внешнего ключа в столбце? - PullRequest
1 голос
/ 19 августа 2009

По сути, у меня есть таблица с кучей внешних ключей, и я пытаюсь запросить только первое вхождение определенного ключа по полю «созданный». Используя пример Blog / Entry, если модель Entry имеет внешний ключ для Blog и внешний ключ для пользователя, то как я могу построить запрос для выбора всех записей, в которых конкретный пользователь написал первую для различных блогов?

class Blog(models.Model):
    ...

class User(models.Model):
    ...

class Entry(models.Model): 
    blog = models.Foreignkey(Blog)
    user = models.Foreignkey(User)

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

query = Entry.objects.magicquery.filter(user=user)

Но, может быть, есть и другой, более эффективный способ. Спасибо!

Ответы [ 3 ]

1 голос
/ 19 августа 2009

query = Entry.objects.filter(user=user).order_by('id')[0]

В основном упорядочите по идентификатору (от низшего к высшему) и нарежьте его, чтобы получить только первый удар из QuerySet.

У меня нет доступной установки Django для проверки моей линии, поэтому, пожалуйста, проверьте документацию, если у меня есть какой-либо тип выше:

заказ по

ограничивающие наборы запросов

Кстати, интересная заметка о разделе «Ограничение наборов»:

Для извлечения одного объекта достаточно чем список (например, ВЫБЕРИТЕ foo FROM bar LIMIT 1), вместо этого используйте простой индекс часть Например, это возвращает Первая запись в базе данных, после упорядочение записей по алфавиту Заголовок:

Entry.objects.order_by('headline')[0]

РЕДАКТИРОВАТЬ: Хорошо, это лучшее, что я мог придумать (после вашего и моего комментария). Он не возвращает объекты Entry, но его идентификаторы: entry_id.

query = Entry.objects.values('blog').filter(user=user).annotate(Count('blog')).annotate(entry_id=Min('id'))

Я буду искать лучший путь.

0 голосов
/ 21 декабря 2018

Древний вопрос, я понимаю - ответ @ zalew близок, но, скорее всего, приведет к ошибке:

ProgrammingError: выражения SELECT DISTINCT ON должны соответствовать начальным ORDER BY выражений

Чтобы исправить это, попробуйте выровнять части запроса ordering и distinct:

Entry.objects.filter(user=user).distinct("blog").order_by("blog", "created")

В качестве бонуса, в случае одновременного создания нескольких записей (маловероятно, но вы никогда не узнаете!), Вы можете добавить детерминизм, включив id в order_by:

Чтобы исправить это, попробуйте выровнять части запроса ordering и distinct:

Entry.objects.filter(user=user).distinct("blog").order_by("blog", "created", "id")
0 голосов
/ 20 августа 2009

Не могу проверить это в данный момент

Entry.objects.filter(user=user).distinct("blog").order_by("id")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...