Django как сортировать объекты по отношению foregein key?
В моем Django приложении я хочу отображать некоторые записи ТВ-шоу. В настоящее время я хочу создать фильтр для ТВ-шоу, отсортированный по последним вышедшим эпизодам. Но я не уверен, как должен выглядеть запрос. Вот как я извлекаю эпизоды за последние 90 дней
def tv_show_by_set_just_released(request):
latest_episodes = TvShowEpisodes.objects.filter(
release_date__lte=datetime.datetime.today(),
release_date__gt=datetime.datetime.today()-datetime.timedelta(days=90)).order_by('-release_date')
Но как мне теперь ссылаться на фактическое ТВ-шоу эпизода? Я хочу сортировать ТВ-шоу по последнему добавленному эпизоду (дата_выпуска). пожалуйста, взгляните на мое моделирование:
class TvShows(models.Model):
objects = RandomManager()
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.TextField(verbose_name=_("Title"), blank=False, null=True, editable=False, max_length=255)
genre_relation = models.ManyToManyField(through='GenreTvShow', to='Genre')
date_added = models.DateTimeField(auto_now_add=True, blank=True, verbose_name=_("Date Added"))
class TvShowEpisodes(models.Model):
objects = RandomManager()
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
duration = models.FloatField(verbose_name=_("Duration"), blank=True, null=True, editable=False, max_length=255)
title = models.TextField(verbose_name=_("Title"), blank=False, null=True, editable=False, max_length=255)
release_date = models.DateField(verbose_name=_("Release Date"), blank=True, null=True, editable=False)
track = models.IntegerField(verbose_name=_("Track #"), blank=True, null=True)
show = models.ForeignKey(TvShows, on_delete=models.CASCADE, related_name='episode_show_relation')
season = models.ForeignKey(TvShowSeasons, on_delete=models.CASCADE, related_name='episode_season_relation')
episode_id = models.CharField(verbose_name=_("Episode ID"), max_length=255, blank=True, null=True, editable=False)
episode_sort = models.IntegerField(verbose_name=_("Episode Number"), blank=True, null=True, editable=False)
synopsis = models.TextField(verbose_name=_("Synopsis"), blank=True, null=True, editable=False, max_length=255)
date_added = models.DateTimeField(auto_now_add=True, blank=True, verbose_name=_("Date Added"))
Вы можете получить TvShows
с помощью:
from django.db.models import Max
TvShows.objects.alias(
latest_episode_release=Max('episode_show_relation__release_date')
).order_by('-latest_episode_release')
или до django-3.2:
from django.db.models import Max
TvShows.objects.annotate(
latest_episode_release=Max('episode_show_relation__release_date')
).order_by('-latest_episode_release')