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