过滤多个到多个字段

时间:2009-04-16 20:06:43

标签: django django-models

所以我有这个模型:

class Message(models.Model):
    creator = models.ForeignKey(User, unique=True)
    note = models.CharField(max_length=200, blank=True)
    recipients = models.ManyToManyField(User, related_name="shared_to")
    read = models.ManyToManyField(User, related_name="read", blank=True)

我想过滤两个收件人并阅读的人,目前我正在这样做。

messages = user.shared_to.all()

for message in messages:
    if user not in message.read:
        do something

我确信有一种方法可以过滤这个,但我无法弄清楚如何。

2 个答案:

答案 0 :(得分:1)

如果您使用Django开发版,或者等到1.1版发布,那​​么您的过滤器可以reference other fields in the model。所以,你的查询看起来像这样:

>>> Message.objects.filter(recipients=F('read'))

(注意:我拼写的reciepients与您在模型中的相同,虽然正确的拼写将是“收件人”)

修改

好的,你的问题很混乱。当我给出上述答案时,我正在阅读您的声明,即您希望所有用户同时处于“收件人”和“阅读”状态。但是,然后阅读您的代码段,您似乎想要一个收件人用户列表,但尚未进入“阅读”列表。

可能你想要什么,但由于要求模糊,我不能完全确定,我无法快速测试它:

# Get list of recipients
shared_to = Message.shared_to.all().values('id')

# Now list of recipients who are not in the read field
unread = Message.objects.exclude(recipients__in=shared_to)

这将进行单个查询,但如果您使用的是MySQL,它仍然可以是more efficient to do two queries(请参阅性能注意事项警告)。

答案 1 :(得分:0)

我认为我最初误解了你的问题。请尝试以下查询。

for message in user.shared_to.exclude(read__id__in=[user.id]):
  do_something()