python - 消息系统的 Django ORM 查询

标签 python django django-models

我有以下内部消息应用程序模型:

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)

class MessageRecipient(models.Model):
    message = models.ForeignKey(Message)
    thread = models.ForeignKey(MessageThread)
    recipient = models.ForeignKey(User)
    status = models.CharField(max_length=20, choices=MESSAGE_STATUS, default="unread")

对于给定用户,获取我正在执行的线程列表:

distinct_threads=MessageThread.objects.filter(messagerecipient__recipient=user)
    .order_by('-message__timestamp').distinct()

如何删除 ORM 中包含状态“已删除”消息的所有线程? (换句话说,我想获取所有线程的列表,但不包含包含状态=“已删除”消息的线程。)

最佳答案

我为此在模型管理器中添加了一个方法:

    def get_active_threads(self, user):
        all_threads = MessageRecipient.objects.filter(recipient=user).order_by('-message__timestamp')

        deleted_threads = []
        final_threads = []

        for thread in all_threads:
            if thread.thread not in (deleted_threads or final_threads):
                if thread.status == "deleted":
                    deleted_threads.append(thread.thread)
                else:
                    final_threads.append(thread)

        return final_threads

关于python - 消息系统的 Django ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948733/

相关文章:

用于列表清理的Java one liner

python - 模型按日期默认排序,空值排在前面

html - 我使用 django 创建了一个博客,想知道我们是否需要将文章存储为 html 格式?

django - 在保存之前将数据添加到 Django 表单?

django get_or_create返回错误: 'tuple' object has no attribute

php - 在 PHP 中加密文本并在 Python 中解密

python - 如何使用 selenium 和 PhantomJS 在 python 中打开新选项卡

python - 实现发布-订阅模式时如何在 Django 和 Twisted 之间进行通信?

python - 将 Django RawQuerySet 转换为查询集

Python:PyNomo 示例的破管错误(在函数 Nomographer 中)