Как упорядочить поле родительской таблицы по количеству полей дочерней таблицы

Надеюсь, я правильно написал заголовок. Я только недавно начал работать с django, и у меня проблема с queryset.

Итак, у меня есть эти модели, представления и файл шаблона.

models.py

class Topic(models.Model):
name = models.CharField(max_length=200)

def __str__(self):
    return self.name


class Room(models.Model):
host = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
topic = models.ForeignKey(Topic, on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=200)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)

class Meta:
    ordering = ['-updated', '-created']

def __str__(self):
    return self.name

views.py

def topics(request):
"""topics page for listed view of topics"""

room_count = Room.objects.all().count()
topics = Topic.objects.all()

context = {'topics': topics, 'room_count': room_count}
return render(request, 'base/topics.html', context)

topics.html

        {% for topic in topics %}
        <li>
          <a href="{% url 'home' %}?q={{topic.name}}">{{ topic.name }}<span> 
        {{topic.room_set.all.count}}</span></a>
        </li>
        {% endfor %}

этот цикл четко сортирует темы по времени создания. но я хочу, чтобы он сортировал их по новому POST запросу в поле room. как я могу это сделать? Я пробовал несколько попыток, но это не решает проблему. Или я должен изменить архитектуру моей базы данных? Поскольку я довольно новичок в базах данных, у меня болит голова, чтобы решить эту проблему. Я гуглил два или три дня, но не смог найти решение.

заранее спасибо.

Model.objects.all().order_by("-id")

от последнего к старейшему

Вы можете достичь этого, аннотировав новый столбец и отсортировав по нему

from django.db.models import OuterRef, Subquery

#subquery which gets latest update from all rooms for the given topic
latest_room_update = Room.objects.filter(topic=OuterRef('pk')).order_by('-updated')

topics = Topics.objects.all()
#add the new column
topics = topics.annotate(latest_related_room_update=Subquery(latest_room_update.values['updated'][:1))

#sort
topics = topics.order_by('-latest_related_room_update')

отредактируйте, потому что .latest() в подзапросе, похоже, вызывает выполнение запроса и, следовательно, приводит к неудаче

Вернуться на верх