Получите несколько моделей в одном QuerySet, упорядоченном по метке времени - PullRequest
0 голосов
/ 21 марта 2019

Я работаю над таблицей, состоящей из всех событий, выполняемых для пользователя, несмотря на то, что эти события представлены 4 различными моделями.

Модели:

  • WebhookSubscription
  • WebhookEvent
  • TokenRefresh
  • LogEvent

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

Есть ли собственный способ получения нескольких моделей в одном QuerySet?

1 Ответ

1 голос
/ 21 марта 2019

Не существует собственного способа извлечения нескольких несвязанных моделей в одном QuerySet. Что вы можете сделать, это использовать наследование моделей, иметь базовую модель для всех моделей событий. Со следующей структурой модели:

class Event(models.Model):
    timestamp = models.DateTimeField()
    user = models.ForeignKey(User)
    ...

class WebhookSubscription(Event):
   ...

class WebhookEvent(Event):
   ...

class TokenRefresh(Event):
   ...

class LogEvent(Event):
   ...

Вы можете сделать запрос напрямую, используя модель события, как;

events = Event.objects.filter(user=user).order_by('timestamp')

Это даст вам экземпляры Event, которые не будут содержать данные для дочерних моделей. Вы можете получить дочерний экземпляр от родителя точно так же, как после OneToOneField (вот как фактически django моделирует наследование, создавая две таблицы и связывая их с внешним ключом):

event.webhooksubscription
event.webhookevent
event.tokenrefresh
event.logevent

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

Этот подход позволит вам выполнять такие операции, как сортировка и нарезка на уровне базы данных, с обратной стороной дополнительной сложности модели (вам потребуется отдельный запрос для получения данных дочерней модели)

...