微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我使用 Graphene 在 Django GraphQL API 中获取对象时,如何限制 ForeignKey 字段的项目数?

如何解决当我使用 Graphene 在 Django GraphQL API 中获取对象时,如何限制 ForeignKey 字段的项目数?

我有一个简单的聊天应用程序,带有一个用 Django 编写的 GraphQL API,带有 Graphene 插件。以及使用 Apollo 作为 GraphQL 客户端的 Angular UI。我有一个类似于聊天室的聊天模型和一个 chatMessage 模型,它更多地是通过外键字段与聊天模型相关联的单个消息,以便每条聊天消息都与某个聊天项目相关联。

以下是Django中的模型规范:-

class Chat(models.Model):
    name = models.CharField(max_length=100,blank=True,null=True)

    admins = models.ManyToManyField(User,related_name="adminInChats",through="ChatAdmin",through_fields=(
        'chat','admin'),blank=True)
    members = models.ManyToManyField(User,related_name="privateChats",through="ChatMember",through_fields=('chat','member'),blank=True)
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_Now_add=True)
    updated_at = models.DateTimeField(auto_Now=True)

    def __str__(self):
        return self.name


class ChatAdmin(models.Model):
    chat = models.ForeignKey(Chat,on_delete=models.CASCADE)
    admin = models.ForeignKey(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.chat


class ChatMember(models.Model):
    chat = models.ForeignKey(Chat,on_delete=models.CASCADE)
    member = models.ForeignKey(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.chat


class ChatMessage(models.Model):
    chat = models.ForeignKey(Chat,on_delete=models.PROTECT)
    message = models.CharField(max_length=1000)
    author = models.ForeignKey(
        User,related_name="chatAuthor",on_delete=models.DO_nothing)
    seenBy = models.ForeignKey(
        User,related_name="chatSeenBy",on_delete=models.PROTECT,null=True)
    created_at = models.DateTimeField(auto_Now_add=True)
    updated_at = models.DateTimeField(auto_Now=True)

    def __str__(self):
        return self.chat

我正在使用 GraphQL 来获取单个聊天项目。以下是它的后端代码:-

class Query(ObjectType):

    chat = graphene.Field(ChatType,id=graphene.ID())

    @login_required
    def resolve_chat(root,info,id,**kwargs):
        chat_instance = Chat.objects.get(pk=id,active=True)
        if chat_instance is not None:
            return chat_instance
        else:
            return None

我在 Angular 上使用我的 Apollo 客户端调用它:-

  GET_CHAT: gql`
    query chat($id: ID!) {
      chat(id: $id) {
        id
        name
        admins {
          id
          firstName
          lastName
        }
        members {
          id
          firstName
          lastName
        }
        chatmessageSet {
          message
          author {
            id
            firstName
            avatar
          }
          createdAt
          seenBy {
            firstName
          }
        }
        createdAt
      }
    }
  `,

因此,当我从客户端进行此查询时,我希望它仅发送该 chatmessageSet 中的前 30 条消息。现在它向我发送了所有内容,这对交通不利。我想基本上对消息进行分页

我知道如何为分页做其他所有事情,但我对 Django 中的后端编码不够熟悉,不知道如何指定 resolve_chat 方法,以便它只向我发送属于该聊天,按 id 降序排序,无论何时被请求。

如何编写 resolve_chat 方法

解决方法

这是使用中继的一个很好的候选者。首先,如果您还没有定义一个 ChatMessageType 并将其接口设置为 relay.Node

class ChatMessageType(DjangoObjectType):
    class Meta:
        model = ChatMessage
        fields = ("message","author","seenBy")
        interfaces = (graphene.relay.Node,)

然后在您的 ChatType 上,像这样定义一个 DjangoFilterConnectionField

class ChatType(DjangoObjectType):
    ...
    chat_messages = DjangoFilterConnectionField("ChatMessageType")

然后你可以这样查询以限制结果

chat(id: $id) {
  ...
  chatMessages(first: 30) {
    message,author,seenBy
  }
  ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。