我有以下模型,其中一个线程可以有很多人。我想找到一个包含特定用户的线程(如果存在)。
class Thread(models.Model):
subject = models.CharField(max_length=150)
users = models.ManyToManyField(settings.AUTH_USER_MODEL, through="UserThread")
class UserThread(models.Model):
thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Message(models.Model):
thread = models.ForeignKey(Thread, related_name="messages", on_delete=models.CASCADE)
sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="sent_messages", on_delete=models.CASCADE)
sent_at = models.DateTimeField(default=timezone.now)
我想要检查的是thread
是否有以下两位用户(user1
和user2
):
thread = Thread.objects.get(Q(UserThread__user==user1) & Q(UserThread__user==user2))
答案 0 :(得分:1)
这应该返回以下两个用户的所有线程:
Thread.objects.filter(Q(userthread__user=user1), Q(userthread__user=user2))
如果您想检查是否有以下两个用户的线程,您可以使用exists执行此操作。
Thread.objects.filter(Q(userthread__user=user1), Q(userthread__user=user2)).exists()
答案 1 :(得分:0)
对于复杂的查询集我建议您使用filter
queryset而不是get,因为filter将返回零或更多结果但get必须返回一个结果,如果你有多个条目需要处理{{1 }}和MultipleObjectsReturned
如果没有找到结果
DoesNotExist
注意:我使用Thread.objects.filter(Q(userthread__user=user1) & Q(userthread__user=user2))
代替userthread
,因为数据库中的表格将按名称UserThread