如何在Django中基于另一个模型对查询进行排序

如何在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.CASC

如果我有:

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
试一试

注意:或者,您可以通过args设置空值的位置。

试试看


注意:或者,您可以通过args设置空值的位置。

感谢@Arakkal Abu的回答。这可能是一个单独的问题,但如何计算从现在到维护完成的天数呢?您可以使用
annotate()
。根据SO指南,最好问一个新问题。感谢您的回答@Arakkal Abu。这可能是一个单独的问题,但如何计算从现在到维护完成的天数呢?您可以使用
annotate()
。根据SO指南,最好问一个新问题。
from django.db.models import Max

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