跳转到主要内容

django伪ORM模型,它查询RestAPI而不是数据库——

项目描述

允许使用与django ORM相同的接口查询django RestAPI。(目标API必须使用django-rest-framework + dynamic-rest库)实际上,它就像任何其他数据库引擎一样工作。您将rest_models引擎添加到备用数据库和rest_models数据路由器中,然后在查询API的模型中添加APIMeta类,就这样!

稳定分支

https://img.shields.io/travis/Yupeek/django-rest-models/master.svg https://readthedocs.org/projects/django-rest-models/badge/?version=latest https://coveralls.io/repos/github/Yupeek/django-rest-models/badge.svg?branch=master Latest PyPI version Requirements Status

开发状态

https://img.shields.io/travis/Yupeek/django-rest-models/develop.svg https://coveralls.io/repos/github/Yupeek/django-rest-models/badge.svg?branch=develop Requirements Status

安装

  1. 使用pip安装

    pip install django-rest-models

  2. 或者,您可以通过下载或克隆此仓库并使用

    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*

文档

完整文档在http://django-rest-models.readthedocs.org/en/latest/

要求

  • Python 2.7, 3.5

  • Django >= 1.8

欢迎贡献和pull requests。

错误和要求

如果你发现错误或对附加功能有要求,请使用GitHub上的问题跟踪器。

https://github.com/Yupeek/django-rest-models/issues

已知限制

django-rest-models支持postgresql和mysql的JSONField,但当前的dynamic-rest(1.8.1)不支持,因此你可以做MyModel.objects.filter(myjson__mydata__contains=’aaa’),但如果drest支持它,则它将工作。

同样适用于DateField的year、month、day查找。

许可

你可以根据GPLv3使用此版本。

作者

原始作者:Darius BERNARD。贡献者:PaulWay

感谢

感谢django提供这个令人惊叹的框架。

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解有关 安装包 的更多信息。

源分布

django-rest-models-2.1.3.tar.gz (42.5 kB 查看散列)

上传时间

支持者