Django order_by ForeignKey набор моделей - PullRequest
0 голосов
/ 01 марта 2012

У меня есть следующие модели django

class Post(models.Model):
    title = models.CharField(max_length=240)

class Comment(models.Model):
    post = models.ForeignKey(Post)
    date = models.DateTimeField(auto_now_add=True)

Мне нужен QuerySet комментариев, упорядоченный сначала по почте, а затем по дате. Но сообщения должны быть упорядочены по последнему комментарию.

Если бы я мог использовать методы модели в QuerySet order_by, это было бы так:

class Post(models.Model):
    title = models.CharField(max_length=240)

    def get_last_comment_date(self):
        return self.comment_set.order_by('-date')[0].date

И порядок, в котором я нуждался, мог быть:

Comment.objects.all().order_by('post__get_last_comment_date', '-date')

Но, к сожалению, методы в order_by недопустимы.

Пожалуйста, помогите. Могу ли я получить такой заказ?

1 Ответ

4 голосов
/ 01 марта 2012

Вы не можете использовать методы в order_by поисках , потому что они преобразуются в SQL .

Итак, почему бы не преобразовать get_last_comment_date в поле ?например, используя приемник сигнала :

from django.db.models import signals

class Post(models.Model):
    title = models.CharField(max_length=240)
    last_comment_date = models.DateField(null=True, blank=True)

def post_last_comment_date(sender, instance=None, **kwargs):
    try:
        last_comment_date = self.comment_set.order_by('-date')[0].date
    except Comment.DoesNotExist:
        return

    if last_comment_date != comment.post.last_comment_date:
        comment.post.last_comment_date = last_comment_date
        comment.post.save()

signals.post_save.connect(post_last_comment_date, sender=Comment)

Теперь вы можете: Comment.objects.order_by('post__last_comment_date', '-date')

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