问题描述
我有一个简单的聊天应用程序,带有一个用 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
}
...
}