Как отсортировать запрос на основе другой модели в Django

#django

#django

Вопрос:

Если бы у меня было:

 class Assets(models.Model):
    assetMake = models.CharField(max_length=50,blank=True,)
    assetModel = models.CharField(max_length=50,blank=True,)

class Maintenance(models.Model):
    assetID = models.ForeignKey(Assets, on_delete=models.CASCADE)
    dateRequested = models.DateTimeField(null=True, blank=True)
    dateCompleted = models.DateTimeField(null=True, blank=True)
    complete = models.BooleanField(default = False)
  

Я хочу перечислить все активы в представлении и отсортировать их по последнему времени их обслуживания (DateCompleted).

Я пытался заставить это работать ниже, но я чувствую, что есть гораздо более простой способ выполнить это, любая помощь приветствуется

 class MaintenanceAgeList(LoginRequiredMixin,TemplateView):
    template_name = 'maintenance_list.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        maintenanceList = []
        assets = Assets.objects.filter(retire = False)
        today = timezone.now().date()
        for asset in assets:
            maintenance = Maintenance.objects.filter(assetID_id = asset.id, complete =True,).order_by('-dateCompleted')
            if maintenance.count() > 0:
                asset['maintDate'] = (maintenance[0].dateCompleted).date()
                maintenanceList.append(asset)
                asset['days'] = (today - lastMaintenance[0].dateCompleted.date()).days
            else:
                asset['maintDate'] = today - timedelta(days=365)
                asset['days'] = 365
                maintenanceList.append(asset)
        maintenanceList = maintenanceList.sort(key=lambda r: r.maintDate)
        context['items'] = maintenanceList
        return context
  

Ответ №1:

Попробуйте

 from django.db.models import Max

Assets.objects.annotate(
    last_modified=Max('maintenance__dateCompleted')
).order_by('-last_modified')
  

Примечание: При необходимости вы можете задать положение нулевых значений с помощью nulls_first или nulls_last аргументов.

Комментарии:

1. Спасибо за ответ @Arakkal Abu. Это может быть отдельный вопрос, но как я мог бы также подсчитать количество дней между настоящим моментом и завершением обслуживания?

2. Вы можете использовать annotate() . В соответствии с рекомендациями SO, лучше задать новый вопрос.