我正在尝试创建一个聊天室。这是我的代码。def make_chatroom(request, user_one, user_two): user_one = user_models.User.objects.get_or_none(pk=user_one) user_two = user_models.User.objects.get_or_none(pk=user_two) if user_one is not None and user_two is not None: try: conversation = models.Conversation.objects.filter( participants=user_one ).filter(participants=user_two) print(conversation) except models.Conversation.DoesNotExist: conversation = models.Conversation.objects.create() conversation.participants.add(user_one, user_two) return redirect(reverse("conversations:detail", kwargs={"pk": conversation.pk}))但“QuerySet”对象没有属性“pk”发生错误。user_one 存在,user_two 也存在。and print 子句打印<QuerySet [<对话:大师,测试>]>我该如何解决?我的模型.py:class Conversation(core_models.TimeStampedModel): participants = models.ManyToManyField( "users.User", related_name="converstation", blank=True ) def __str__(self): usernames = [] for user in self.participants.all(): usernames.append(user.username) return ", ".join(usernames) def count_messages(self): return self.messages.count() count_messages.short_description = "메세지 수" def count_participants(self): return self.participants.count() count_participants.short_description = "참가자 수"class Message(core_models.TimeStampedModel): message = models.TextField() user = models.ForeignKey( "users.User", related_name="messages", on_delete=models.CASCADE ) conversation = models.ForeignKey( "Conversation", related_name="messages", on_delete=models.CASCADE ) def __str__(self): return f"{self.user} says: {self.message}"
1 回答

万千封印
TA贡献1891条经验 获得超3个赞
您的问题在于conversation
最终会成为两种类型之一,具体取决于是否抛出错误。
没有错误:
conversation = models.Conversation.objects.filter( participants=user_one ).filter(participants=user_two)
在这种情况下,对话是一个查询集,即与您指定的过滤器匹配的所有对象。
错误:
conversation = models.Conversation.objects.create()
在这种情况下,对话是一个对话实例,因此它将具有 pk 属性。
get
我认为您在这里缺少的是在查询结束时调用。就目前而言,查询永远不会抛出错误models.Conversation.DoesNotExist
我希望这能解决!
PS 调用get的时候其实有可能会抛出两个错误,你也可以得到一个MultipleObjectsReturned
错误。如果你绝对肯定这永远不会发生,你就不需要处理它,但我想我应该让你知道
添加回答
举报
0/150
提交
取消