#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, лучше задать новый вопрос.