对同一mod的不同实例使用相同的kwarg过滤反向Django关系

2024-10-02 22:30:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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)) 

但这对我来说是一个空洞的询问。有趣的是,如果我搜索

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

只是,然后我得到一个包含特定用户foo的所有房间的查询集。但这种过滤方式对我的需求不够具体。所以我认为这不是正确的方法。有人能给我指出正确的资源吗?如果有的话,可以建议另一种方法吗?我正在使用SQLite,如果这有任何帮助的话

提前谢谢

艾哈迈德


Tags: djangoselftruereturnonmodelsdefclass
1条回答
网友
1楼 · 发布于 2024-10-02 22:30:19

这不是必需的,但是如果您在房间和用户之间定义一个ManyToManyField,您的查询就会变得更容易。这可以使用现有的RoomMember模型作为直通表,因此不需要任何数据库更改,但您应该删除与成员相关的\u名称,以便可以将该名称用于m2m:

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

现在你可以做:

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

相关问题 更多 >