django rest框架与sqlalchemy集成
django-rest-witchcraft的Python项目详细描述
django rest巫术
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)),...]