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})
Вернуться на верх