为了账号安全,请及时绑定邮箱和手机立即绑定

查询集 Q 过滤器?问得到?如何获得'pk'

查询集 Q 过滤器?问得到?如何获得'pk'

白衣非少年 2023-02-22 17:17:25
我正在尝试创建一个聊天室。这是我的代码。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错误。如果你绝对肯定这永远不会发生,你就不需要处理它,但我想我应该让你知道


查看完整回答
反对 回复 2023-02-22
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号