Django 多对多字段的过滤器

Django 多对多字段的过滤器,django,django-models,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.ManyToManyFiel

所以我有这个模型:

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

我肯定有办法过滤这个问题,但我不知道怎么过滤。

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

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

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

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

如果您使用Django开发版本,或者等到版本1.1发布,那么您的过滤器就可以。因此,您的查询如下所示:

>>> Message.objects.filter(recipients=F('read'))
(注意:我对Receipements的拼写与您在模型中的拼写相同,尽管正确的拼写是“Receipes”)

编辑

好的,你的问题令人困惑。当我给出上述答案时,我正在阅读您的声明,您希望所有同时处于“收件人”和“已读”状态的用户。但是,在阅读代码片段时,您似乎需要一个收件人列表,但还不在“已读”列表中

这可能是您想要的,但我不完全确定,因为需求不明确,我无法快速测试:

# 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,它可能仍然是(请阅读性能注意事项警告)。

如果您使用的是Django开发版本,或者等到版本1.1发布后,您的过滤器就可以了。因此,您的查询如下所示:

>>> Message.objects.filter(recipients=F('read'))
(注意:我对Receipements的拼写与您在模型中的拼写相同,尽管正确的拼写是“Receipes”)

编辑

好的,你的问题令人困惑。当我给出上述答案时,我正在阅读您的声明,您希望所有同时处于“收件人”和“已读”状态的用户。但是,在阅读代码片段时,您似乎需要一个收件人列表,但还不在“已读”列表中

这可能是您想要的,但我不完全确定,因为需求不明确,我无法快速测试:

# 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,它仍然可以(阅读性能注意事项警告)