django伪ORM模型,它查询RestAPI而不是数据库——
项目描述
允许使用与django ORM相同的接口查询django RestAPI。(目标API必须使用django-rest-framework + dynamic-rest库)实际上,它就像任何其他数据库引擎一样工作。您将rest_models引擎添加到备用数据库和rest_models数据路由器中,然后在查询API的模型中添加APIMeta类,就这样!
稳定分支
开发状态
安装
使用pip安装
pip install django-rest-models
或者,您可以通过下载或克隆此仓库并使用
pip install -e ..
要求
此数据库包装器与以下版本兼容
python 3.6, 3.7
django 2.0, 2.1, 2.2, 3.0, 3.1, 3.2
在API上,已对此进行测试
django-rest-framework 3.11, 3.12, 3.13
dynamic-rest 2.1
示例
settings.py
DATABASES = {
'default': {
...
},
'api': {
'ENGINE': 'rest_models.backend',
'NAME': 'https://requestb.in/',
'USER': 'userapi',
'PASSWORD': 'passwordapi',
'AUTH': 'rest_models.backend.auth.BasicAuth',
},
}
DATABASE_ROUTERS = [
'rest_models.router.RestModelRouter',
]
models.py
class MyModel(models.Model):
field = models.IntegerField()
...
class Meta:
# basic django meta Stuff
verbose_name = 'my model'
# the only customisation that make this model special
class APIMeta:
pass
class MyOtherModel(models.Model):
other_field = models.IntegerField()
first_model = models.ForeignKey(MyModel, db_column='mymodel')
...
class Meta:
# basic django meta Stuff
verbose_name = 'my other model'
# the only customisation that make this model special
class APIMeta:
pass
目标API要求
为了使此数据库适配器像关系数据库一样工作,目标API必须遵守一些要求
dynamic-rest已安装,并且所有序列化器/视图必须分别继承自Dynamic*(DynamicModelSerializer等)
每个API序列化器必须
提供id字段
提供相关字段(Model上的多对多和外键)作为DynamicRelationField
提供反向相关字段。对于每个ForeignKey和ManyToMany,必须在相关模型的序列化器中添加一个字段。
class MenuSerializer(DynamicModelSerializer):
pizzas = DynamicRelationField('PizzaSerializer', many=True) # Menu.pizza = ManyToMany
class Meta:
model = Menu
name = 'menu'
fields = ('id', 'code', 'name', 'pizzas')
deferred_fields = ('pizza_set', )
class PizzaSerializer(DynamicModelSerializer):
toppings = DynamicRelationField(ToppingSerializer, many=True)
menu = DynamicRelationField(MenuSerializer) # Add this because Menu.pizza = ManyToMany
class Meta:
model = Pizza
name = 'pizza'
fields = ('id', 'name', 'price', 'from_date', 'to_date', 'toppings', 'menu')
django-rest-models通过django check框架提供了一种方法来检查api与本地模型的一致性。在每次启动时,它将通过OPTIONS查询api以检查本地模型是否与远程序列化器匹配。
注意事项
由于这不是一个真正的关系型数据库,所以无法实现所有功能。一些限制也由动态rest过滤系统继承。
聚合:API端点未实现,可能在未来的版本中实现。
使用OR的复杂过滤:传递给dynamic-rest的所有过滤器都将组合为AND,因此不可能使用OR。
在过滤中使用否定AND:否定AND相当于OR,因此适用之前的限制。
在过滤中使用否定OR:由于嵌套过滤的计算复杂且易出错,我们禁用了所有OR。事实上,只有一些嵌套的AND被接受。只有Q()对象的最终值可以被否定。
简而言之,你不能
Pizza.objects.aggregate()
Pizza.objects.annotate()
Pizza.objects.filter(Q(..) | Q(..))
Pizza.objects.exclude(Q(..) & Q(..))
Pizza.objects.exclude(Q(..) | Q(..))
but you can :
Pizza.objects.create
Pizza.objects.bulk_create
Pizza.objects.update
Pizza.objects.bulk_update
Pizza.objects.select_related
Pizza.objects.prefetch_related
Pizza.objects.values
Pizza.objects.values_list
Pizza.objects.delete
Pizza.objects.count()
Pizza.objects.filter(..., ..., ...)
Pizza.objects.filter(...).filter(...).exclude(...)
Pizza.objects.exclude(..., ...).exclude(...)
Pizza.objects.filter(Q(..) & Q(..))
Pizza.objects.none()
pizza.toppings.add(...)
pizza.toppings.remove(...)
pizza.toppings.set(...)
pizza.toppings.clear(...)
特定行为
已实现一些特定行为以利用Rest API的额外功能。
当插入时,API返回结果模型。插入的模型将更新为结果值。这暗示了两件事
如果你在API中为字段提供了默认值,这些数据将在数据未提供时填充到创建的实例中。
如果序列化器有一些计算数据,其数据将始终用作替换你给模型的值的。例如:Pizza.cost,这是配料成本的累加。每次保存后,其值都会更新。
支持
此数据库API支持
select_related
order_by
only
defer
filter
exclude
delete
update
create
批量创建(带pk检索)
ManyToManyField
ForeignKey*
文档
要求
Python 2.7, 3.5
Django >= 1.8
欢迎贡献和pull requests。
错误和要求
如果你发现错误或对附加功能有要求,请使用GitHub上的问题跟踪器。
已知限制
django-rest-models支持postgresql和mysql的JSONField,但当前的dynamic-rest(1.8.1)不支持,因此你可以做MyModel.objects.filter(myjson__mydata__contains=’aaa’),但如果drest支持它,则它将工作。
同样适用于DateField的year、month、day查找。
许可
你可以根据GPLv3使用此版本。
感谢
感谢django提供这个令人惊叹的框架。
项目详情
django-rest-models-2.1.3.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9c02fa222b7e3be24a6c21f15b0d63468e39490eca98ef0f5392dfd36742007b |
|
MD5 | 78911dd272cfb477ea0a3801742b494f |
|
BLAKE2b-256 | 4f317af840ea4f9a1a601abad5551569ba11e3c66059d288bbc3b1a9bfa40e58 |