我正在开发一个消息应用程序。模型如下。
class ChatRoom(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
room_name = models.CharField(max_length=100, null=True, blank=True)
participants = models.ManyToManyField(User)
class Meta:
db_table = TABLE_PREFIX + "chat_room"
class Message(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
chat_room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE)
message = models.TextField()
sent_by = models.ForeignKey(User, on_delete=models.CASCADE)
created_on = models.DateTimeField(default=django.utils.timezone.now)
class Meta:
db_table = TABLE_PREFIX + "chat_message"
我必须过滤包含用户列表的聊天室对象。
例如:向api 发送这样的数据
{
"participants": [2,3]
}
它应该返回一个聊天室对象,该对象包含用户"2"和用户"3"作为参与者。
我试过用过滤
room = ChatRoom.objects.filter(participants__in=serializer.validated_data['participants'])
但它返回用户为"1"和用户为"2"的房间对象列表。
我也尝试过使用get((,但它返回了一个错误。
我做错了什么?我怎样才能做对?
谢谢你调查我的问题。希望你有一个解决方案。
您说过您正在使用Query。。
ChatRoom.objects.filter(participants__in=serializer.validated_data['participants'])
- filter函数返回与条件匹配的模型的对象列表
- get函数只返回模型的单个对象,如果没有或有多个项符合条件,则抛出异常。这就是为什么get只用于候选密钥或唯一的结果条件
在你的情况下,我想两个参与者都可以是许多房间的一部分,也可能没有这样的房间。如果只想返回一个查询集,那么可以使用这个。
room_list= ChatRoom.objects.filter(participants__in=serializer.validated_data['participants']
if len(room_list) >0:
room = room_list[0]
else:
room = None
这将返回所有给定参与者所在的第一个房间,您可以将0替换为任何有效值,或者如果希望它返回特定的房间,则可以在查询中添加更多内容。