Python 如何使用GraphQL模式进行类似JSON模式的数据验证?
我们正在研究将GraphQL用于我们正在开发的无头CMS的版本2 在这个CMS的版本1中,我们使用JSON模式在保存到数据库中之前根据模式验证每个文档——例如,如果是博客文章,它将根据Python 如何使用GraphQL模式进行类似JSON模式的数据验证?,python,json,validation,graphql,jsonschema,Python,Json,Validation,Graphql,Jsonschema,我们正在研究将GraphQL用于我们正在开发的无头CMS的版本2 在这个CMS的版本1中,我们使用JSON模式在保存到数据库中之前根据模式验证每个文档——例如,如果是博客文章,它将根据文章模式进行验证,如果是综述(“最佳”列表),它将根据综述模式进行验证 对于版本2,我们正在考虑将GraphQL用于API。然后我们意识到GraphQL模式基本上与JSON模式并行——它描述文档结构、字段类型等 因此,我们可以简单地拥有“模式真理的一个来源”,即GraphQL模式,并将其用于查询文档和在保存新修订时
文章
模式进行验证,如果是综述(“最佳”列表),它将根据综述
模式进行验证
对于版本2,我们正在考虑将GraphQL用于API。然后我们意识到GraphQL模式基本上与JSON模式并行——它描述文档结构、字段类型等
因此,我们可以简单地拥有“模式真理的一个来源”,即GraphQL模式,并将其用于查询文档和在保存新修订时验证新文档。(注意,我说的是根据GraphQL模式验证JSON数据,而不是根据模式验证GraphQL查询。)
我认为数据将根据模式中的所有字段进行验证,不推荐的字段除外,因为您只想根据字段的“最新版本”进行验证
我们可以做三件事之一:
总结以上几点,并用一个问题回答您的问题:让GraphQL在其正常功能中执行验证重担有什么不对?您知道吗?我用你的graphql模式试过了,基本的对我来说很好。问题可能出在细节上。您想使用GraphQL有什么原因吗?看来你会损失很多,因为你有实际的模式验证。您好,刚刚遇到您的问题,在我们公司,我们想使用GraphQL来模式/验证我们的JSON产品,您最终找到了解决方案吗?谢谢。进一步研究后,我认为主要问题是输入类型不能是或包含联合。我们的模式肯定包含联合,所以我们不能将其用作突变的输入类型(没有hacks)。另请看,对于每种输入类型,可以有一个输入查询(无论是
查询
还是变异
),我是否错了?(您将从现有的输入联合自动生成它们)或者您是说您的请求者不知道它是哪种类型?如果是这样的话,您可以有一个通用的“分派”查询,其输出是联合类型?我不完全确定您的建议:您的意思是有updateArticle()
和updaterundup()
突变吗?是的,你可以这样做。内部联合仍然是一个问题,例如上面的articlessection
——您可以使用articlessectioninput
类型,为联合中的每种类型提供可为空的字段,例如:textssection
、photoSection
和videoSection
。。。但它相当混乱。我是说有updateArticle
和updateRoundup
。您还需要createTextSection
,createPhotoSection
,等等。因为它是输入,所以您知道自己在做什么,所以不需要多态性。鉴于GraphQL已经规定了输入和输出对象之间的分离,无论您做什么,都会有一定程度的重复。
schema {
query: Query
}
type Query {
documents: [Document!]!
document(id: Int): Document!
}
interface Document {
id: Int!
title: String!
}
type Article implements Document {
id: Int!
title: String!
featured: Boolean!
sections: [ArticleSection!]!
}
union ArticleSection = TextSection | PhotoSection | VideoSection
type TextSection {
content: String!
heading: String
}
type PhotoSection {
sourceUrl: String!
linkUrl: String
caption: String
content: String
}
type VideoSection {
url: String!
}
type Roundup implements Document {
id: Int!
title: String!
isAward: Boolean!
intro: String
hotels: [RoundupHotel!]!
}
type RoundupHotel {
url: String!
photoUrl: String @deprecated(reason: "photoUrl is deprecated; use photos")
photos: [RoundupPhoto!]!
blurb: String!
title: String
}
type RoundupPhoto {
url: String!
caption: String
}