【问题标题】:Filter objects from a table based on ManyToMany field根据 ManyToMany 字段从表中过滤对象
【发布时间】:2021-12-27 04:02:44
【问题描述】:

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

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"

我必须过滤包含用户列表的 ChatRoom 对象。

例如:向 api 发送这样的数据

{
  "participants": [2,3]
}

它应该返回一个包含用户“2”和用户“3”作为参与者的 ChatRoom 对象。

我曾尝试使用过滤它

room = ChatRoom.objects.filter(participants__in=serializer.validated_data['participants'])

但它会返回包含用户“1”和用户“2”的房间对象列表。

我也尝试过使用 get() 但它返回错误。

我做错了什么,我该如何做对?

感谢您调查我的问题。希望你有解决办法。

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-forms


    【解决方案1】:

    你说你正在使用 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 替换为任何有效值或在查询中添加更多内容。

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多