Джанго отличает внешние ключи для использования в другой модели - PullRequest
1 голос
/ 04 марта 2011
class Log:
  project = ForeignKey(Project)
  msg = CharField(...)
  date = DateField(...)

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

Я пытался:

id_list = Log.objects.order_by('-date').values_list('project_id').distinct()[:4]
entries = Log.objects.filter(id__in=id_list)

id_list пусто, если я не удаляю order_by (), но тогда это не в правильном порядке.

entries = Log.objects.filter(id__in=id_list)

Объекты в записях не в том же порядке, что и в id_list, потому что, когда вы используете функцию Mysql IN (), она не будет сортировать результат по порядку ввода ... Как это сделать в django?

Ответы [ 3 ]

0 голосов
/ 04 марта 2011

Я думаю, что Скирмантас прав, и вы должны сделать это более сложным способом:

from django.db.models import Max
projects = Project.objects.annotate(last_logged=Max('log__date')).order_by('-last_logged')[:4]
log_entries = [proj.log_set.order_by('-date')[0] for proj in projects]
0 голосов
/ 04 марта 2011

Вот решение для одного запроса (но, вероятно, оно будет слишком медленным):

Log.objects.filter(project__log__date__gte=F('date')).annotate(c=Count('project__log')).filter(c__lte=4).order_by('project', 'c')

0 голосов
/ 04 марта 2011

Похоже, что с помощью django orm невозможно достичь того, чего вы хотите. Документация утверждает, что невозможно использовать order_by вместе с различными.

Однако может быть другой способ решить эту проблему. Может быть, вы могли бы выбрать объекты проекта и аннотировать их последними записями журнала.

...