我对文档模式的定义如下:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"id": "http://example.com/schemas/document.json#",
"title": "Document",
"type": "object",
"additionalProperties": false,
"required": ["type", "name", "fields"],
"properties": {
"type": {
"constant": "document"
},
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"readOnly": {
"type": "boolean"
},
"properties": {
// common properties
// model-specific properties
}
}
}
当使用NodeJs时,通过使用ajv验证器的少量代码,很容易绕过简单模式的限制,如下所示:
function extendJsonSchema(baseSchema, extendingSchema) {
let extendedSchema = Object.assign({}, extendingSchema);
extendedSchema.properties = Object.assign(extendedSchema.properties, baseSchema.properties)
extendedSchema.required = extendedSchema.required.concat(baseSchema.required)
return extendedSchema
}
let baseSchema = require('./base.schema.json')
let extendingSchema = require('./extending.schema.json')
let extendedSchema = extendJsonSchema(baseSchema, extendingSchema)
const validate = ajv.compile(extendedSchema)
这至少解决了我的用例。
因此,您可以使用组合来“扩展”一个模式,但是您永远不能“覆盖”另一个模式定义的内容。
让我们来看一个没有冲突属性的简单扩展示例。
/schema/base
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
}
}
/schema/扩展
{
"allOf": [{ "$ref": "/schema/base" }],
"properties": {
"baz": { "type": "string" }
}
}
这对JSON模式非常有用。现在让我们来看一个属性定义冲突的示例。
/模式/覆盖
{
"allOf": [{ "$ref": "/schema/base" }],
"properties": {
"bar": { "type": "integer" },
"baz": { "type": "boolean" }
}
}
在本例中,两个模式都有一个< code>/properties/bar字段。如果你从继承的角度考虑这个问题,你会误解这里发生的事情。在这种情况下,两个“/属性/栏”字段都必须有效。没有要解决的冲突。正如关键字所说,“所有”模式都必须有效。因为< code>bar不可能既是整数又是字符串,所以没有文档会根据< code>/schema/override进行验证。
希望这能给你足够的信息来解决你的问题,避免最常见的问题。
我正在与Avro/Kafka和Confluent的Avro模式注册中心合作。 我使用avsc文件和avdl制作了一些基本模式和具有基本类型的主题。 我正在查看Confluent制作的API文档,以尝试将模式发展到版本2。特别是本部分: https://docs.confluent.io/current/schema-registry/using.html#register-a-new-versio
问题内容: 窗口小部件现在包括显示模式的概念(由NCWidgetDisplayMode表示),该概念使您可以描述可用的内容量,并允许用户选择压缩视图或展开视图。 如何在ios 10.0中扩展小部件?它无法在ios 9中运行。 问题答案: 好的,我在这里找到了正确的解决方案。 1)设定的显示模式到第一中: 2)实施新的协议方法: 它将作为官方应用程序运行。 图片
如何使用扩展 想象一下这个场景,我们需要在下面这个列表里展示数据: 专辑标题从哪里来? Album 本身是个 Model 对象,所以它不应该负责如何展示数据。你需要一些额外的代码添加展示数据的逻辑,但是为了保持 Model 的干净,我们不应该直接修改代码,因为这样不符合单一职责原则。 Model 层最好就是负责纯粹的数据结构,如果有数据的操作可以放到扩展中完成。 接下来我们会创建一个扩展,扩展现有
扩展 扩展是一种十分强大的机制,可以让你在不用继承的情况下,给已存在的类、结构体或者枚举类添加一些新的功能。最重要的一点是,你可以在你没有访问权限的情况下扩展已有类。这意味着你甚至可以扩展 Cocoa 的类,比如 UIView 或者 UIImage 。 举个例子,在编译时新加的方法可以像扩展类的正常方法一样执行。这和装饰器模式有点不同,因为扩展不会持有扩展类的对象。
问题内容: 有没有一种方法可以扩展内置的Django Group对象以添加其他属性,类似于可以扩展用户对象的方法?使用用户对象,你可以执行以下操作: 并将以下内容添加到settings.py文件中 这使你: 扩展小组有什么等效方法吗?如果没有,我是否可以采用其他方法? 问题答案: 你可以创建一个对Group进行子类化的模型,添加自己的字段,并使用模型管理器返回所需的任何自定义查询集。这是一个截断的
另一个有趣的事情Django已经为你做好了就是模板扩展。这是什幺意思呢?它意味着你可以使用你的HTML相同代码为你网站不同的网页共享。 通过这种方法,当你想使用同样的信息或布局,或者你想改变某些模板内容时,你不必在每个文件中都重复着相同的代码。你仅仅只需要改变一个文件,而不是所有的。 创建一个基础模板 一个基础模板是最重要的模板,你扩展到你网站的每一页。 让我们创建一个base.html文件到bl