django rest框架与sqlalchemy集成

django-rest-witchcraft的Python项目详细描述


django rest巫术

Build StatusRead The DocsPyPI versionCoveralls StatusBlack

django rest框架与sqlalchemy的集成

django rest witchcraft是django rest框架的扩展,它增加了对sqlalchemy的支持。它旨在提供 使用django-rest框架和django-orm构建rest api的类似开发经验,除了 炼金术。

安装

pip install django-rest-witchcraft

快速启动

首先,让我们定义一些简单的模型:

importsqlalchemyassaimportsqlalchemy.orm# noqafromsqlalchemy.ext.declarativeimportdeclarative_baseengine=sa.create_engine('sqlite:///:memory:',echo=True)session=sa.orm.scoped_session(sa.orm.sessionmaker(bind=engine))Base=declarative_base()Base.query=session.query_property()classGroup(Base):__tablename__='groups'id=sa.Column(sa.Integer(),primary_key=True,autoincrement=True)name=sa.Column(sa.String())classUser(Base):__tablename__='users'id=sa.Column(sa.Integer(),primary_key=True,autoincrement=True)name=sa.Column(sa.String())fullname=sa.Column(sa.String())password=sa.Column(sa.String())_group_id=sa.Column('group_id',sa.Integer(),sa.ForeignKey('groups.id'))group=sa.orm.relationship(Group,backref='users')classAddress(Base):__tablename__='addresses'id=sa.Column(sa.Integer(),primary_key=True,autoincrement=True)email_address=sa.Column(sa.String(),nullable=False)_user_id=sa.Column(sa.Integer(),sa.ForeignKey('users.id'))user=sa.orm.relationship(User,backref='addresses')Base.metadata.create_all(engine)

这里没有什么特别之处,我们有一个User类,它可以属于一个Group实例,并且有许多Address 实例

此序列化程序可以处理嵌套的创建、更新或部分更新操作。

让我们用所有字段为User定义序列化程序:

classUserSerializer(serializers.ModelSerializer):classMeta:model=Usersession=sessionfields='__all__'

这将为我们创建以下序列化程序:

>>> serializer = UserSerializer()

>>> serializer
UserSerializer():
    id = IntegerField(allow_null=False, help_text=None, label='Id', required=True)
    name = CharField(allow_null=True, help_text=None, label='Name', max_length=None, required=False)
    fullname = CharField(allow_null=True, help_text=None, label='Fullname', max_length=None, required=False)
    password = CharField(allow_null=True, help_text=None, label='Password', max_length=None, required=False)
    group = GroupSerializer(allow_null=True, is_nested=True, required=False):
        id = IntegerField(allow_null=False, help_text=None, label='Id', required=False)
        name = CharField(allow_null=True, help_text=None, label='Name', max_length=None, required=False)
    addresses = AddressSerializer(allow_null=True, many=True, required=False):
        id = IntegerField(allow_null=False, help_text=None, label='Id', required=False)
        email_address = CharField(allow_null=False, help_text=None, label='Email_address', max_length=None, required=True)
    url = UriField(read_only=True)

让我们尝试使用全新的序列化程序创建一个User实例:

serializer=UserSerializer(data={'name':'shosca','password':'swordfish',})serializer.is_valid()serializer.save()user=serializer.instance

这将为我们创建以下用户:

>>> user
User(_group_id=None, id=1, name='shosca', fullname=None, password='swordfish')

让我们尝试更新用户User实例并更改其密码:

serializer=UserSerializer(user,data={'name':'shosca','password':'password',})serializer.is_valid()serializer.save()user=serializer.instance

我们的用户现在看起来像:

>>> user
User(_group_id=None, id=1, name='shosca', fullname=None, password='password')

让我们再次尝试更新我们的User实例,但这次我们只更改它的密码:

serializer=UserSerializer(user,data={'password':'swordfish',},partial=True)serializer.is_valid()serializer.save()user=serializer.instance

这将为我们更新以下用户:

>>> user
User(_group_id=None, id=1, name='shosca', fullname=None, password='swordfish')

我们的用户不属于Group,让我们修复它:

group=Group(name='Admin')session.add(group)session.flush()serializer=UserSerializer(user,data={'group':{'id':group.id}})serializer.is_valid()serializer.save()user=serializer.instance

现在,我们的用户看起来是:

>>> user
User(_group_id=1, id=1, name='shosca', fullname=None, password='swordfish')

>>> user.group
Group(id=1, name='Admin')

我们还可以使用嵌套更新通过用户更改用户组的名称:

classUserSerializer(serializers.ModelSerializer):classMeta:model=Usersession=sessionfields='__all__'extra_kwargs={'group':{'allow_nested_updates':True}}serializer=UserSerializer(user,data={'group':{'name':'Super User'}},partial=True)serializer.is_valid()user=serializer.save()

现在,我们的用户看起来是:

>>> user
User(_group_id=1, id=1, name='shosca', fullname=None, password='swordfish')

>>> user.group
Group(id=1, name='Super User')

我们可以在如下视图集中使用此序列化程序:

fromrest_witchcraftimportviewsetsclassUserViewSet(viewsets.ModelViewSet):queryset=User.queryserializer_class=UserSerializer

我们可以在urls.py中注册这个视图集,比如:

fromrest_witchcraftimportroutersrouter=routers.DefaultRouter()router.register(r'users',UserViewSet)urlpatterns=[...url(r'^',include(router.urls)),...]

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将Scanner对象作为构造函数参数传递给UserInterface类   spring未能启动bean“subtocolWebSocketHandler”;嵌套的例外是java。lang.IllegalArgumentException:没有处理程序   Java EE应用程序中后台服务的多线程Java线程(设置守护进程和优先级)?   java Pull to refresh返回列表的第一个位置   无法将comparator类转换为java。可比的   java将json从servlet传递到dojo   JavaHibernate:将子类实例转换为超类实例   java警告调用servlet类时非法反射访问   java静态变量值   java@Entity和@embeddeble之间有什么区别   java将作业配置导入公共作业配置类(注释配置)   sql公共表表达式(以values语句开头)在java中给出错误   java在ImageJ中使用ImageProcessor   java PostgreSQL executeBatch()会随着时间的推移而变慢   java在安卓中以表格形式排列sqllite表数据?   java中SVG的swing定制呈现   java删除与另一个实体映射的实体   java何时/如何添加ListView适配器,使用back按钮恢复它?(片段)   java为什么IBinder和Binder之间的类型转换不是非法的?   java在方法参数列表中使用ArrayList或List