针对相同模型的不同实例使用相同的kwarg过滤反向Django关系

时间:2018-08-08 14:37:10

标签: python django django-models

我是Django的新手,我试图使用Django 2.0.5从头开始构建一个聊天服务器。

我今天制作了以下模型。

class DateTimeModel(models.Model):
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Room(DateTimeModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    def __str__(self):
        return str(self.id)

class RoomMember(DateTimeModel):
    room = models.ForeignKey(Room, on_delete=models.PROTECT, related_name='members')
    user = models.ForeignKey(User, on_delete=models.PROTECT)

    def __str__(self):
        return 'member "{}" in room "{}"'.format(self.user, self.room)

class Message(DateTimeModel):
    sender = models.ForeignKey(RoomMember, on_delete=models.PROTECT)
    text = models.TextField()

    def __str__(self):
        return '"{}" sent by "{}"'.format(self.text, self.sender)

鉴于我有一个用户列表,现在我希望能够对一个房间运行查询。我以以下方式尝试了Django文档中的Q() objects

Room.objects.filter(Q(members__user=foo) & Q(members__user=bar)) 

但是这为我产生了空的QuerySet。有趣的是,如果我搜索

Room.objects.filter(Q(members__user=foo))

仅,然后我得到包含特定用户foo的所有Room的QuerySet。但是这种过滤方式还不足以满足我的需求。因此,我认为这不是正确的方法。任何人都可以向我指出正确的资源,或者如果有的话建议另一种方法?我正在使用SQLite,如果有任何帮助。

预先感谢

艾哈迈德

1 个答案:

答案 0 :(得分:0)

这不是必需的,但是如果您定义从Room到User的ManyToManyField,查询将变得更加容易。这可以将您现有的RoomMember模型用作通过表,因此不需要任何数据库更改,但是应该删除成员related_name,以便可以将该名称用于m2m:

class Room(DateTimeModel):
    ...
    members = models.ManyToManyField(User, through='RoomMember')

现在您可以这样做:

Room.objects.filter(member=foo).filter(member=bar)