Skip to main content
 首页 » 编程设计

python之如何在 Django 中获取带有用户 ID 的 ManyToManyField 对象

2024年11月01日31zengkefu

我有一些内置的 Django Channels Chat,我创建了一个 Chat 模型,我可以在其中存储消息(它就像一个带 ID 的 CHAT ROOM),我想通过 2 个用户 ID 获取单个对象。

我尝试了类似 Chat.objects.filter(participiants__in=[ID1,ID2]) 的东西,但它只返回他们所在的每一个聊天。

def post(self,request): 
 
        sender = UserProfile.objects.get(user_id=request.user.id) 
 
        message = request.data.get('message') 
        post_id = request.data.get('post_id') 
        recipient_id = request.data.get('recipient_id') 
 
        chat_room = Chat.objects.filter(participiants__in=[sender, recipient_id]) 
 
class Chat(models.Model): 
    participiants = models.ManyToManyField(UserProfile, related_name="chats") 
    messages = models.ManyToManyField(Message, blank=True, related_name="messages") 
 
    def get_room_messages(self): 
        messages = self.messages.order_by('-timestamp').all() 
        return [[i.text,i.sender_id,i.link,i.post_id] for i in messages] 
 

请您参考如下方法:

过滤后你应该计算参与者的数量,并检查它是否等于2,比如:

from django.db.models import <b>Count</b> 
 
chat_rooms = Chat.objects.filter( 
    participiants__in=[sender, recipient_id] 
).annotate( 
    <b>nparticipants=Count('participiants')</b> 
).filter(<b>nparticipants=2</b>)

如果只有一个这样的 Chat 对象,您可以使用 .get(..) 代替:

from django.db.models import Count 
 
chat_rooms = Chat.objects.filter( 
    participiants__in=[sender, recipient_id] 
).annotate( 
    nparticipants=Count('participiants') 
)<b>.get(</b>nparticipants=2<b>)</b>