我是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,如果有任何帮助。
预先感谢
艾哈迈德
答案 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)