Вы можете сделать это на python (как предложено выше) или позволить БД сделать за вас грязную работу.
Вам потребуется создать QuerySet, содержащий все потоки с удаленным сообщением для конкретного пользователя, а затем второй QuerySet, который получает все потоки, не содержащиеся в первом:
delthreads = MessageThread.objects.filter(messagerecipient__recipient=user,
messagerecipient__status='deleted').distinct()
result = MessageThread.objects.filter(messagerecipient_recipient=user)
.exclude(messagethread_in=delthreads).distinct()
Однако, с точки зрения производительности (особенно на больших столах) это повредит вам. Ваша модель нуждается в некоторой реструктуризации для обеспечения более эффективных запросов Рассмотрим:
class MessageThread(models.Model):
subject = models.CharField(max_length=256, blank=False)
class Message(models.Model):
thread = models.ForeignKey(MessageThread)
content = models.CharField(max_length=5000, blank=False)
timestamp = models.DateTimeField(auto_now_add=True, blank=False)
sender = models.ForeignKey(User)
recipient = models.ForeignKey(User)
status = models.CharField(max_length=20, choices=MESSAGE_STATUS, default="unread")
Если вы ожидаете, что вы будете часто выполнять этот запрос, вы можете добавить поле кэша в MessageThread, которое вы можете обновлять всякий раз, когда кто-то удаляет сообщение в этой теме:
class MessageThread(models.Model):
subject = models.CharField(max_length=256, blank=False)
dirty = models.BooleanField(default=False)
Тогда было бы очень легко извлечь список тем без удаленных сообщений.
nondelthreads = MessageThread.objects.filter(message__recipient=user, dirty=True).distinct()