Поле Datetime мешает Django order_by в аннотационном запросе
В настоящее время я работаю с тремя моделями, маршрутами, посещениями и контейнерами. Каждый маршрут имеет два посещения, а каждое посещение имеет один контейнер, поэтому я делаю аннотацию на количество маршрутов для каждого контейнера. Мне удалось почти получить желаемый результат, но мне также необходимо поле created_at
в моей модели Routes, однако если я вызываю его, сортировка больше не работает.
Модели
class Container(models.Model):
license_plate = models.CharField(max_length=255)
container_number = models.IntegerField(default=-1)
container_type = models.BooleanField(default=True) # True para calientes, False para fríos
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.license_plate
class Meta:
db_table = "trucks_containers"
class Attendance(models.Model):
IN = 'in'
OUT = 'out'
CHECKIN_TYPES = [
(IN, 'in'),
(OUT, 'out')
]
type = models.CharField(max_length=10, choices=CHECKIN_TYPES)
closed = models.BooleanField(default=False)
damaged = models.BooleanField(default=False)
datetime = models.DateTimeField()
is_crashed_container = models.BooleanField(default=False)
is_crashed_truck = models.BooleanField(default=False)
has_solar_panel = models.BooleanField(default=False)
truck = models.ForeignKey(Truck, on_delete=models.CASCADE, null=True)
container = models.ForeignKey(Container, on_delete=models.CASCADE)
gate = models.ForeignKey(Gate, on_delete=models.CASCADE)
snapshot = models.ForeignKey(
general_models.Snapshot,
on_delete=models.SET_NULL, null=True
)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = "trucks_attendances"
class Route(models.Model):
start_attendance = models.ForeignKey(
Attendance,
related_name='start_attendance',
on_delete=models.CASCADE
)
end_attendance = models.ForeignKey(
Attendance,
related_name='end_attendance',
on_delete=models.CASCADE
)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = "trucks_routes"
Почти правильный результат
Используемый запрос:
containers_routes = truck_models.Route.objects\
.values('end_attendance__container__id',
'end_attendance__container__container_number',
'end_attendance__container__license_plate')\
.annotate(completed_routes=Count('end_attendance__container__id'))\
.order_by('-completed_routes')
Результат:
<QuerySet [{'end_attendance__container__id': 450, 'end_attendance__container__container_number': 2625, 'end_attendance__container__license_plate': 'JP2495', 'completed_routes': 7}, {'end_attendance__container__id': 227, 'end_attendance__container__container_number': 2104, 'end_attendance__container__license_plate': 'JN7780', 'completed_routes': 3}
Должно быть правильно, но результат неправильный
Используемый запрос:
containers_routes = truck_models.Route.objects\
.values('created_at','end_attendance__container__id',
'end_attendance__container__container_number',
'end_attendance__container__license_plate')\
.annotate(completed_routes=Count('end_attendance__container__id'))\
.order_by('-completed_routes')
Результат:
<QuerySet [{'end_attendance__datetime': datetime.datetime(2021, 8, 23, 16, 27, 10, tzinfo=<UTC>), 'end_attendance__container__id': 328, 'end_attendance__container__container_number': 2277, 'end_attendance__container__license_plate': 'HXDK40', 'completed_routes': 1}, {'end_attendance__datetime': datetime.datetime(2021, 8, 30, 16, 16, 41, tzinfo=<UTC>), 'end_attendance__container__id': 793, 'end_attendance__container__container_number': 3971, 'end_attendance__container__license_plate': 'GRJH17', 'completed_routes': 1}
Как вы видите, он не заказывает completed_routes правильно, когда я добавляю любые поля с датами в .values(), я также пробовал с датами, хранящимися в модели Attendances, но произошло то же самое. Что я упускаю?
NOTE Я разместил только первые два пункта, чтобы показать, что они меняются при добавлении нового поля. Зарегистрировано около 900 различных контейнеров.