Как отсортировать количество посещений в приложении Django? - PullRequest
2 голосов
/ 26 июня 2009

В Django (1.0.2) у меня есть 2 модели: Lesson и StatLesson.

class Lesson(models.Model):
    contents = models.TextField()
    def get_visits(self):
        return self.statlesson_set.all().count()

class StatLesson(models.Model):
    lesson = models.ForeignKey(Lesson)
    datetime = models.DateTimeField(default=datetime.datetime.now())

Каждый StatLesson регистрирует 1 посещение определенного урока. Я могу использовать lesson.get_visits (), чтобы узнать количество посещений этого урока.

Как получить набор запросов уроков, отсортированных по количеству посещений? Я ищу что-то вроде этого: Lesson.objects.all (). Order_by ('statlesson__count') (но это, очевидно, не работает)

Ответы [ 2 ]

2 голосов
/ 26 июня 2009

Django 1.1 будет иметь совокупную поддержку.

В Django 1.0.x вы можете рассчитывать автоматически с помощью дополнительного поля:

class Lesson(models.Model):
    contents = models.TextField()
    visit_count = models.IntegerField(default=0)

class StatLesson(models.Model):
    lesson = models.ForeignKey(Lesson)
    datetime = models.DateTimeField(default=datetime.datetime.now())

    def save(self, *args, **kwargs):
        if self.pk is None:
            self.lesson.visit_count += 1
            self.lesson.save()
        super(StatLesson, self).save(*args, **kwargs)

Тогда вы можете запросить так:

Lesson.objects.all().order_by('visit_count')
1 голос
/ 26 июня 2009

Вам нужно будет выполнить некоторые нативные SQL-операции, используя extra .

например. (очень приблизительно)


Lesson.objects.extra(select={'visit_count': "SELECT COUNT(*) FROM statlesson WHERE statlesson.lesson_id=lesson.id"}).order_by('visit_count')

Вам нужно убедиться, что SELECT COUNT(*) FROM statlesson WHERE statlesson.lesson_id=lesson.id содержит имена таблиц записи в БД для вашего проекта (так как statlesson и урок не будут правильными).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...