【发布时间】:2013-12-20 04:20:39
【问题描述】:
如何检查thread是否只包含sender(用户1)和recipient(用户2),而没有其他用户。
models.py
class Thread(models.Model):
user = models.ManyToManyField(User)
is_hidden = models.ManyToManyField(User, related_name='hidden_thread', blank=True)
class Message(models.Model):
thread = models.ForeignKey(Thread)
sent_date = models.DateTimeField(default=datetime.now)
sender = models.ForeignKey(User)
body = models.TextField()
is_hidden = models.ManyToManyField(User, related_name='hidden_message', blank=True)
我试过了
>>> Thread.objects.filter(user=user1&user2)
>>> Thread.objects.filter(user=user1|user2)
# Both gave me an error: Unsupported operand.
# Then this
>>> Thread.objects.filter(Q(user=user1) & Q(user=user2))
# Which gave me no threads at all.
# Then this
>>> Thread.objects.filter(Q(user=user1) | Q(user=user2)).distinct()
# Gave me threads of both the users.
我想要的是只检查指定用户的线程。假设用户 1 想向用户 2 发送消息。我想要的是,首先检查两个用户之间是否存在线程。如果有,请获取该线程,或者创建一个新线程。这怎么可能?最好的方法是什么。请帮我。谢谢。
请告诉我| 和& 有什么区别?因为我对这两个有非常不同的结果。
编辑:
>>> t1 = Thread.objects.get(id=1)
>>> t1
[<User: a>,<User: b>]
>>> t2 = Thread.objects.get(id=2)
>>> t2
[<User: a>,<User: b>,<User: c>]
>>> t3 = Thread.objects.get(id=3)
>>> t3
[<User:a>,<User: c>]
>>> t4 = Thread.objects.get(id=4)
>>> t4
[<User:a>,<User:b>]
我想要的是获得只有用户a 和用户b 存在的线程,而没有其他用户。在这种情况下,它将是:t1 和 t4。希望我说清楚了。谢谢。
【问题讨论】:
-
|是or,&是and。我现在没有时间弄清楚如何进行实际查询,但至少这部分很容易回答。 -
Thread.objects.filter(Q(user=user1) & Q(user=user2))中的Q是什么 -
用于复杂查询。见this
标签: django django-models django-views django-orm