Как упорядочить поле родительской таблицы по количеству полей дочерней таблицы
Надеюсь, я правильно написал заголовок. Я только недавно начал работать с 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() в подзапросе, похоже, вызывает выполнение запроса и, следовательно, приводит к неудаче