2015-01-07 72 views
0

我要检查所有MessageMessageState每个Threads(即order_threads_message)对象的列表和它们的对象字段,如果任何线程具有隐藏,则所有的消息作出这样的主题为隐藏太(/或将其从order_threads_message中删除)。我想在视图中将其传递给模板之前执行此操作。我怎么做?如果你没有找到我,请询问。我会很乐意解释。请帮助我如何在意见中做到这一点。我会很感激。谢谢。Django的 - 查询

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关系 - 这意味着每个消息可以有多个MessageState,这是没有意义的(如果一个状态说隐藏,一个不?) –

+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))) 

如果MessageStatemessage_hidden的ATLEAST一个是False此查询将返回Thread对象。

+0

我会验证并再次回来。 – Kakar

+0

@ruddra嗨,我收到一个错误 'FieldError:无法解析关键字'messagestate_message'到字段中。选择ar e:body,id,messagestate,sender,sender_id,sent_date,thread,thread_id – Robin

+0

其实我通过提供'related_name'来修改@Kakar的定义,检查我的答案:)。 – ruddra