2015-01-07 2 views
0

Я хочу, чтобы проверить MessageState всей Message в каждом Threads (т.е. order_threads_message), и если какие-либо из потоков имеют все сообщения, скрытые затем сделать эту тему как скрытые слишком (/ или удалить его из order_threads_message). Я хочу сделать это в представлении перед тем, как передать его в шаблон. Как мне это сделать? Если вы не получили меня, пожалуйста, спросите. Я буду рад объяснить. Пожалуйста, помогите мне, как это сделать во взглядах. Я буду благодарен. Спасибо.Джанго - Запрос списка объектов и их полей объектов

models.py:

class Thread(models.Model): 
    subject = models.CharField(max_length=50, blank=True, null=True) 
    user = models.ManyToManyField(User) 

class ThreadState(models.Model): 
    thread = models.ForeignKey(Thread) 
    user = models.ForeignKey(User) 
    thread_hidden = models.BooleanField(default=False) 

class Message(models.Model): 
    thread = models.ForeignKey(Thread) 
    sender = models.ForeignKey(User) 
    sent_date = models.DateTimeField(default=datetime.now) 
    body = models.TextField() 

class MessageState(models.Model): 
    message = models.ForeignKey(Message) 
    user = models.ForeignKey(User) 
    read = models.BooleanField(default=False) 
    message_hidden = models.BooleanField(default=False) 

views.py

@login_required 
def message(request): 
    user = request.user 
    threads = user.thread_set.all() 
    order_threads_message = threads.annotate(max_sent_date=Max('message__sent_date')).order_by('-max_sent_date') 
    if order_threads_message.count() > 0: 
     recent_thread = order_threads_message[0] 
     if recent_thread.message_set.all().count() > 0: 
      recent_thread_conversations = recent_thread.message_set.all() 
      return render(request, 'conversations.html', { 
       'all_threads':order_threads_message, 
       'conversations':recent_thread_conversations, 
       'active': recent_thread.id 
       }) 
     else: 
      recent_thread_conversations = 0 
      return render(request, 'conversations.html', { 
       'all_threads':order_threads_message, 
       'conversations':recent_thread_conversations, 
       'active': recent_thread.id 
       }) 
    else: 
     order_threads_message = 0 
     recent_thread_conversations = 0 
     return render(request, 'conversations.html', { 
      'all_threads':order_threads_message, 
      'conversations':recent_thread_conversations, 
      }) 
+0

Я не совсем понимаю, почему MessageState является отдельной моделью из Message и, в частности, почему у вас есть отношения ForeignKey - это означает, что для каждого сообщения может быть несколько MessageStates, что не имеет смысла (что, если одно состояние говорит скрытый, а другой нет?) –

+0

Да, вот в чем его смысл. Таким образом, сообщение может быть скрыто для пользователя, который скрыл сообщение, но остается видимым для других пользователей, которые этого не сделали. – Kakar

ответ

0

Я выполнил этот запрос для следующих моделей:

Модели

class Thread(models.Model): 
    subject = models.CharField(max_length=50, blank=True, null=True) 
    user = models.ManyToManyField(User) 

class ThreadState(models.Model): 
    thread = models.ForeignKey(Thread) 
    user = models.ForeignKey(User) 
    thread_hidden = models.BooleanField(default=False) 

class Message(models.Model): 
    thread = models.ForeignKey(Thread, related_name = 'message_thread') 
    sender = models.ForeignKey(User) 
    sent_date = models.DateTimeField(default=datetime.now) 
    body = models.TextField() 

class MessageState(models.Model): 
    message = models.ForeignKey(Message, related_name='messagestate_message') 
    user = models.ForeignKey(User) 
    read = models.BooleanField(default=False) 
    message_hidden = models.BooleanField(default=False) 

Запрос

Thread.objects.filter(message_thread__in = Message.objects.filter(messagestate_message__in=MessageState.objects.filter(message_hidden=False))) 

Этот запрос будет возвращать Thread объекты, если по крайней мере один из его MessageState «s message_hidden является False.

+0

Я проверю и вернусь снова. – Kakar

+0

@ruddra Привет, Я получаю сообщение об ошибке 'FieldError: Не удается разрешить ключевое слово 'messagestate_message' в поле. Выбор e: body, id, messagestate, sender, sender_id, sent_date, thread, thread_id' – Robin

+0

На самом деле я немного изменил определение @Kakar, предоставив 'related_name', проверьте мой ответ :). – ruddra

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