python - Django M2M QuerySet 过滤多个外键

标签 python django many-to-many django-queryset

对于我正在处理的消息传递模块,我有这两个类。这个想法是对话由一组参与者(两个或更多)表示。我正在努力寻找一种通过逻辑查找对话的方法,即我试图找到的所需对话具有以下参与者。我试过Conversation.objects.filter(participants__in=[p1, p2])但是,这会执行 OR 样式查询,p1 是参与者或 p2 是参与者。我想要 p1 和 p2 并且... pN 是参与者。有什么帮助吗?

class Conversation(models.Model):
    date_started = models.DateTimeField(auto_now_add=True)
    participants = models.ManyToManyField(User)

    def get_messages(self):
        return Message.objects.filter(conversation=self)

    def new_message(self, sender, body):
        Message.objects.create(sender=sender, body=body, conversation=self)
        self.save()


class Message(models.Model):
    sender = models.ForeignKey(User)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    conversation = models.ForeignKey(Conversation)

    def __unicodde__(self):
        return body + "-" + sender 

最佳答案

我认为你只需要迭代过滤。这可能完全是胡说八道,因为我有点 sleep 不足,但也许是这样的经理方法:

class ConversationManager(models.Manager):
    def has_all(self, participants):
        # Start with all conversations
        reducedQs = self.get_query_set()
        for p in participants:
            # Reduce to conversations that have a participant "p" 
            reducedQs = reducedQs.filter(participants__id=p.id)
        return reducedQs

一般来说,您应该养成使用表级查询管理器方法的习惯,而不是类方法。通过这种方式,您会得到一个查询集,如果需要,您可以进一步过滤。

灵感来自在 the documentation 中具有成员名称 Paul 的所有组的查询和 this answer .

关于python - Django M2M QuerySet 过滤多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663762/

相关文章:

Python:重构代码以删除全局变量

python - 如何找到 Python 生成的进程的名称?

python - 运行时语法产品创建

java - JPA ManyToMany 列表为空

python - 是否可以从 Julia 调用 Python 函数并返回其结果?

python - 相对于定义的质心,图像中的颜色分布是什么

django - 在 Git 中管理项目变体的最佳实践?

python - Django - AttributeError : 'NoneType' object has no attribute 'first_name'

java - JPA 对所有者的多对多合并触发对连接表的删除

php - 如何: migration many-to-many laravel artisan