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

我正在尝试创建一个聊天室。这是我的代码。


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}"


白衣非少年
浏览 132回答 1
1回答

万千封印

您的问题在于conversation最终会成为两种类型之一,具体取决于是否抛出错误。没有错误:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation&nbsp;=&nbsp;models.Conversation.objects.filter( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;participants=user_one &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;).filter(participants=user_two)在这种情况下,对话是一个查询集,即与您指定的过滤器匹配的所有对象。错误:conversation&nbsp;=&nbsp;models.Conversation.objects.create()在这种情况下,对话是一个对话实例,因此它将具有 pk 属性。get我认为您在这里缺少的是在查询结束时调用。就目前而言,查询永远不会抛出错误models.Conversation.DoesNotExist我希望这能解决!PS 调用get的时候其实有可能会抛出两个错误,你也可以得到一个MultipleObjectsReturned错误。如果你绝对肯定这永远不会发生,你就不需要处理它,但我想我应该让你知道
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python