擅长:python、mysql、java
<p>您可以使用python(如上面所建议的那样)或者让DB为您完成脏工作。在</p>
<p>您需要构造一个包含所有线程的查询集,其中包含针对特定用户的已删除消息,然后构建第二个查询集,该查询集获取第一个用户未包含的所有线程:</p>
<pre><code>delthreads = MessageThread.objects.filter(messagerecipient__recipient=user,
messagerecipient__status='deleted').distinct()
result = MessageThread.objects.filter(messagerecipient_recipient=user)
.exclude(messagethread_in=delthreads).distinct()
</code></pre>
<p>但是,性能方面(尤其是在大型表上)这会伤害到您。您的模型需要进行一些重组,以便进行更有效的查询。考虑:</p>
^{pr2}$
<p>如果您预计将经常执行此查询,则可以向MessageThread添加一个缓存字段,每当有人删除该线程中的消息时,可以更新该字段:</p>
<pre><code>class MessageThread(models.Model):
subject = models.CharField(max_length=256, blank=False)
dirty = models.BooleanField(default=False)
</code></pre>
<p>然后,提取一个没有删除消息的线程列表将非常容易。在</p>
^{4}$