所以我有这个模型:
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
我确信有一种方法可以过滤这个,但我无法弄清楚如何。
答案 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()