Запрос с Django ORM (присоединение к моделям?) - PullRequest
0 голосов
/ 21 октября 2011

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

class Thread(models.Model):
    name = models.CharField(max_length=50)
    category = models.ForeignKey(Category)

class Post(models.Model):
    thread = models.ForeignKey(Thread)
    datetime = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User)

Это для моей системы форумов.

Мне нужно получить все Thread категории X, и мне нужно иметь несколько пользовательских атрибутов, таких как datetime и pk последнего сообщения в ветке, например:

* * 1010

Затем я хочу перенести все в шаблон, чтобы я получил:

{{ t.pk }} as thread_pk
{{ t.last_post_pk }} as last_post_pk

и т. Д.

Ответы [ 2 ]

1 голос
/ 21 октября 2011

Чтобы получить последнее сообщение для каждой темы, вы должны использовать агрегацию:

Post.objects.filter(thread__in=threads).values('thread').annotate(last_id=Max('id')).order_by()

Это даст вам last_id от каждого потока в threads.

0 голосов
/ 21 октября 2011

Поскольку Django не выполняет объединение так, как вы ожидаете с объединениями SQL (см. Мой комментарий для дальнейшего объяснения), я решил бы это в представлении (или, возможно, в методе, добавленном в класс Thread). Рассмотрим следующий пример:

def index(request):
    res = []
    for t in Thread.objects.filter(category__name='x'):
        res.append((t, Post.objects.filter(thread=t).order_by('-datetime')[0]))
    # Optionally sort by datetime here:
    # res.sort(key=lambda x: x[1].datetime, reverse=True)
    return render_to_response('index.html', {'result': res})

Затем вы можете использовать его в шаблоне следующим образом:

{% for r in res %}
    Thread {{ r.0.name }}, last post by {{ r.1.author.name }} on {{ r.1.datetime }}.
{% endfor %}

# This would give something like this:
# Thread mythread, last post by john on Oct. 21, 2011, 1:52 a.m..

Создавая кортеж из Thread s и Post s, вы на самом деле не присоединяетесь к ним, но делаете их легко доступными в шаблоне.

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