基于ManyToMany字段从表中筛选对象



我正在开发一个消息应用程序。模型如下。

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'])
  1. filter函数返回与条件匹配的模型的对象列表
  2. 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替换为任何有效值,或者如果希望它返回特定的房间,则可以在查询中添加更多内容。

最新更新