django объединяет наборы запросов из нескольких таблиц - PullRequest
0 голосов
/ 14 июня 2010

Если у меня есть запросы к нескольким таблицам, например:

d = Relations.objects.filter(follow = request.user).filter(date_follow__lt = last_checked)
r = Reply.objects.filter(reply_to = request.user).filter(date_reply__lt = last_checked)
article = New.objects.filter(created_by = request.user)
vote = Vote.objects.filter(voted = article).filter(date__lt = last_checked)

, и я хочу отобразить результаты по всем из них, упорядоченные по дате (я имею в виду не перечисление всех ответов, затем всех голосов и т. Д.).Почему-то я хочу объединить все эти результаты в одном наборе запросов.Возможно ли это?

Ответы [ 2 ]

9 голосов
/ 14 июня 2010

Кажется, вам нужны разные объекты для выполнения общих операций ...

1) В этом случае может быть лучше абстрагировать эти свойства в суперклассе ... Я имею в виду, что у вас может быть класс Event, который определяет поле user, а все другие ваши классы событий будут иметь подкласс это.

class Event(model.Model):
    user = models.ForeignKey(User)
    date = ...

class Reply(Event):
    #additional fields

class Vote(Event):
    #additional fields

Тогда вы сможете сделать следующее

Event.objects.order_by("date") #returns both Reply, Vote and Event

Выезд http://docs.djangoproject.com/en/1.2/topics/db/models/#id5 для получения информации о наследовании модели.

2) У вас также может быть модель Event с общим отношением к другому объекту. Для меня это звучит чище, поскольку Vote концептуально не является «событием». Выезд: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1

В любом случае, я думаю, что ваша проблема связана с дизайном

1 голос
/ 15 июня 2010

В дополнение к предложению Себастьяна № 2: Django на самом деле имеет некоторые встроенные функции, которые вы можете «использовать» для этого;для администратора у него уже есть модель, которая регистрирует действия пользователя и ссылается на объекты посредством общего отношения внешнего ключа, я думаю, вы могли бы просто подклассировать эту модель и использовать ее для своих целей:Теперь вы можете регистрировать все свои уведомления и т. Д., Где они происходят, с помощью log_addition(request, object) и фильтровать таблицу журналов, чем для ваших целей!Если вы хотите регистрировать также изменения / удаления и т. Д., Вы можете сделать себе некоторые вспомогательные функции для этого!

...