Как отсортировать вывод Django QuerySet по дате? - PullRequest
0 голосов
/ 22 июня 2019

У меня есть такие данные:

Данные, созданные по этому запросу:

data = Post.objects.filter(post_by=UserID).
       values_list('posted_date_time','post_id')
       .union(post_wishlist.objects.filter(user_id=UserID)
       .values_list('added_date_time', 'post_id'))

Могу ли я сделать запрос лучше, если он предоставляет укороченные данные в соответствии с датой.

Output

<QuerySet [(datetime.datetime(2019, 6, 14, 20, 4, 58, 104805, tzinfo=<UTC>), UUID('b15be3c1-3f70-4ccb-af08-dba385f883a1')), 
          (datetime.datetime(2019, 6, 12, 18, 42, 38, 675120, tzinfo=<UTC>), UUID('f2ea2ad0-f228-43d7-823a-c824a041feb2')), 
          (datetime.datetime(2019, 6, 12, 17, 46, 38, 479890, tzinfo=<UTC>), UUID('16c66e9b-0cbf-4b6d-b848-78cf771f522c')),
          (datetime.datetime(2019, 6, 21, 20, 17, 15, 785171, tzinfo=<UTC>), UUID ('a169afcf-267b-4212-97e5-6221595ab107')),
          (datetime.datetime(2019, 6, 15, 7, 33, 34, 136331, tzinfo=<UTC>), UUID('9aac6b06-6622-4587-9956-5b517aaa11e8')),
          (datetime.datetime(2019, 6, 18, 16, 11, 49, 134458, tzinfo=<UTC>), UUID('00271b56-9ff7-4f9d-b9c0-2592ca9436d2')), 
          (datetime.datetime(2019, 6, 21, 21, 3, 53, 528261, tzinfo=<UTC>), UUID('df0d8905-5377-4b8d-99d9-eba644273eaa')),
          (datetime.datetime(2019, 6, 21, 21, 4, 6, 256957, tzinfo=<UTC>), UUID('c339d797-f37d-48ff-94a6-e6d1510e23cc')), 
          (datetime.datetime(2019, 6, 18, 17, 10, 18, 388505, tzinfo=<UTC>), UUID('00271b56-9ff7-4f9d-b9c0-2592ca9436d2'))]>

В QuerySet у меня есть несколько экземпляров datetime с UUID,

Я создал эти данные, используя 2 разные модели, и обе модели имеют разные имена полей datetime, поэтому я думаю, что мыне могу использовать ЦЕПЬ.

Здесь я хочу отсортировать по дате и времени

Заранее большое спасибо

1 Ответ

1 голос
/ 22 июня 2019

Если это одна модель, вы всегда можете выбрать order_by , что является лучшим подходом.

class ModelA(models.Model):
    timestamp = models.DateTimeField(default=timezone.now)

ModelA.objects.order_by("timestamp")

Если у вас есть несколько моделей, которые имеют сходные данные (необязательно поля), вы все равно можете использовать order_by.

class ModelB(models.Model):
    created = models.DateTimeField(default=timezone.now)
    title = models.CharField(max_length=32)


ModelA.objects.values("timestamp").union(
    ModelB.objects.annotate(timestamp=F("created")).values("timestamp")
).order_by("timestamp").values("timestamp")

Важно, чтобы количество полей воба запроса одинаковы, и соответствующие поля в запросах имеют одинаковый тип данных.(Я мог бы использовать .values() слишком много раз здесь. Я не могу вспомнить синтаксис в верхней части моей головы.)

Это, конечно, не так читаемо, как сортировка вpython .

data_a = ModelA.objects.values("timestamp")
data_b = ModelB.objects.annotate(timestamp=F("created")).values("timestamp")

final_data = sorted(data_a + data_b, key=lambda x: x["timestamp"])

Обратите внимание, что в обоих случаях я аннотировал и добавил поле с именем timestamp во второй модели, чтобы соответствовать имени в первой.Это просто делает все проще.

order_by имеет два преимущества перед питоном sorted

  1. В большинстве случаев это намного быстрее, как это происходит в БД, оптимизированной дляобрабатывать такие операции.
  2. Позволяет продолжить выполнение запросов.Например, если вы хотите получить последние 10 результатов, вы можете .order_by("-timestamp")[10], но с Python вам придется извлечь все данные и затем отбросить большую их часть.Это может быть очень дорого и расточительно, когда вы имеете дело с большими наборами данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...