2010-06-14 4 views
0

Если у меня есть вопросы по нескольким таблицам, как:Джанго присоединиться querysets из нескольких таблиц

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) 

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

+0

Вы можете сообщить, что вы хотите сделать это? Мы можем предоставить вам альтернативное решение ... – sebpiq

+0

, потому что: 1.i есть список уведомлений, и я хочу отображать все «новые уведомления» для пользователя в том же порядке, что и события (я имею в виду, возможно, сначала ответ, затем голосование и т. д.). Кроме того, я хочу заказать все эти уведомления по дням (и это кажется возможным, только если у меня есть набор запросов для всех них). и 2. вторая причина - у меня есть функция поиска в другом месте, с запросом в поле «имя» UserProfile, и я хочу добавить qset для «username» для таблицы User, чтобы он мог искать оба. Большое спасибо! – dana

+1

Я думаю, что если вы не хотите менять архитектуру своих моделей, как упомянуто Sébastien Piquemal, вы можете поместить все объекты в список и отсортировать их, но не с помощью набора запросов. –

ответ

1

В дополнение к предложению числа Себастьен в 2: Django на самом деле имеет некоторые встроенные функции, которые вы могли бы «злоупотребление» для этого; для администратора он имеет уже модель, которая регистрирует действия пользователя и ссылается на объектах через общее внешний ключ отношение, я думаю, вы могли бы просто подкласс этой модели и использовать его для своих целей:

from django.contrib.admin.models import LogEntry, ADDITION 
from django.utils.encoding import force_unicode 
from django.contrib.contenttypes.models import ContentType 

class MyLog(LogEntry): 
    class Meta(LogEntry.Meta): 
     db_table_name = 'my_log_table' #use another name here 

def log_addition(request, object): 
    LogEntry.objects.log_action(
     user_id   = request.user.pk, 
     content_type_id = ContentType.objects.get_for_model(object).pk, 
     object_id  = object.pk, 
     object_repr  = force_unicode(object), 
     action_flag  = ADDITION 
    ) 

Вы можете теперь регистрируйте все ваши уведомления и т. д., где они происходят с log_addition(request, object) и фильтруют таблицу журналов, чем для ваших целей! Если вы хотите регистрировать изменения и удаления и т. Д., Вы можете сделать для себя некоторые вспомогательные функции!

+0

ну, это интересно! я попробую так! благодаря! :) – dana

9

Похоже, вам нужны различные объекты, чтобы иметь общие операции ...

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

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

+0

Да, это единственное решение. благодаря! – dana

+1

+1 для общих отношений. –

+0

в любом случае, если я использую метод подкласса, как мне изменить мои (выше) запросы для заполнения новых созданных моделей и заставить переменные манипулировать моим шаблоном? Я не вижу примера в ссылке djangoproject. Спасибо! – dana

Смежные вопросы