我对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,如果这有任何帮助的话
提前谢谢
艾哈迈德
这不是必需的,但是如果您在房间和用户之间定义一个ManyToManyField,您的查询就会变得更容易。这可以使用现有的RoomMember模型作为直通表,因此不需要任何数据库更改,但您应该删除与成员相关的\u名称,以便可以将该名称用于m2m:
现在你可以做:
相关问题 更多 >
编程相关推荐