Django orm foreign key latest data using filter query
class Schedule(models.Model):
user = models.ForeignKey(USER, on_delete=models.SET_NULL, null=True)
area = models.ForeignKey(Site, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True, null=True)
updated_at = models.DateTimeField(auto_now=True, null=True)
area = Schedule.objects.values("area").annotate(latest=Max('created_at')).values("area")
latest = Schedule.objects.values("area").annotate(latest=Max('created_at')).values("latest")
Schedule.objects.filter(created_at__in=latest, area__in=area)
Я получил нужное мне значение.
Однако я испытываю затруднения, когда фильтрую с помощью ForeignKey и DateTimeField. Не может ли быть лучшего способа?
Кроме того, нельзя ли сделать его чище, кроме кода выше?
Полагаю, вы можете создать Manager для вашей Модели и использовать функцию selected_related, она создаст быстрый запрос для вас, и это готовое решение "из коробки" Django. Посмотрите документацию Django.
Вот пример, основанный на вашем коде
В Model.py что-то вроде
class SheduleManager(model.Manager):
def all_prefetched_data(self):
qs = self.get_queryset()
qs = qs.select_related(
'area_set'
)
return qs
в том же Model.py нужно назначить менеджера в модели Shedule
listing = SheduleManager
Теперь в представлении вы можете сортировать элементы базы данных по дате создания, делать запросы с ForiegnKey, проходящие через все ваши базы данных. Вы также можете отобразить результат, например, в your_template.html со словарем b_list
view.py
def GetList(request):
sh_list = Schedul.listing.all().order_by('-created_at')
return render(request, 'your_template.html', {'b_list': sh_list})