Django:过滤多个到多个,找到存在多个连接模型实例的实例

时间:2018-04-14 15:20:19

标签: python django

我有以下模型,其中一个线程可以有很多人。我想找到一个包含特定用户的线程(如果存在)。

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是否有以下两位用户(user1user2):

thread = Thread.objects.get(Q(UserThread__user==user1) & Q(UserThread__user==user2))

2 个答案:

答案 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

创建