在DjangoRest Fram中使用模型

2024-04-19 20:34:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django Rest框架的新手,我想开发API调用。 我目前使用的是Mysql数据库,所以如果我必须对数据库进行更改,我是必须在我的项目中编写模型,还是可以在我的数据库上执行原始数据操作。在

比如: 这是我的网址.py包含一个URL列表的文件,如果有任何一个URL被命中 它直接调用视图.pyfile和rest我在该函数中执行特定的操作,比如连接到MySQL数据库,执行SQL查询并将JSON响应返回到前端。在

这是进行API调用的好方法吗?如果没有请指引我。在

任何建议或帮助将不胜感激。在


Tags: 文件项目djangopy模型框架restapi
3条回答

你不需要使用模型,但你真的应该。django的ORM(它处理数据库读/写的方式)功能非常棒,非常有用。在

如果您一直在执行原始sql语句,那么您要么遇到了django函数失败的非常具体的情况,要么您使用django效率低下,应该重新考虑一下为什么首先使用django。在

为什么要使用Django而不使用ORM访问数据库?大多数情况下,ORM的工作方式与您预期的一样,甚至允许您执行如下搜索:

class Foo(models.Model):
    code = models.CharField(max_length=10, ...)

class Bar(models.Model):
    code = models.CharField(max_length=10, ...)
    foo = models.ForeignKey(Foo, ...)

然后执行如下查询:

^{pr2}$

这是一样的,但比:

select bar.* from yourapp_bar bar inner join yourapp_foo foo on (bar.foo_id = foo.id) where bar.code = 'baz' and foo.code = 'bat'

更短,更易于维护。在

现在,谈到Django Rest Framework和Django:尽管后面对Django和DRF的修改都涉及到了,但是不能突然期望在父对象是父对象的同时创建嵌套对象(例如Foo是父对象,而Bar是嵌套的),就像关系管理器(Django)和create/update方法一样ModelSerializer类,您仍然可以相信Django可以通过使用它而不是SQL来节省时间、精力和生命。在

我给你举一个关于DRF的例子。我们假设这里只涉及Foo模型。你喜欢哪一个?在

# yourapp.urls
from .views import UserViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = router.urls

# yourapp.views
class FooViewSet(viewsets.ModelViewSet):
    """
    A viewset that provides the standard actions for
      a single foo element
    """
    queryset = Foo.objects.all()
    serializer_class = FooSerializer
    # I am assuming you created the FooSerializer to map certain fields...

或者。。。在

# yourapp.urls
from .views import mywholeurl
from django.conf.urls import url

urlpatterns = [
    url('users/(\d+)', mywholeview),
]

# yourapp.views

from django.db import connection
from rest_framework import status
from rest_framework.response import Response

def mywholeview(request, id):
    cursor = connection.cursor()
    if request.method in ('POST', 'PUT'):
        cursor.execute('update yourapp_foo set %s where id = %%s' % ', '.join(["%s=%%s" % p[0] for p in request.data.items()]), list(p[1] for p in request.data.items()) + [id])
        row = cursor.fetchone()
        if row[0]
            return Response(status=status.HTTP_201_ACCEPTED)
        else:
            return Response(status=status.HTTP_404_NOT_FOUND)
    elif request.method = 'GET':
        cursor.execute('select * from yourapp_foo where id = %s', [id])
        row = cursor.fetchone()
        if row:
            columns = [col[0] for col in cursor.description]
            data = zip(columns, row)
            return Response(data, status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_404_NOT_FOUND)
    elif request.method = 'DELETE':
        cursor.execute('delete from yourapp_foo where id = %s', [id])
        row = cursor.fetchone()
        if not int(row[0]):
            return Response(status=status.HTTP_404_NOT_FOUND)
        else:
            return Response(status=status.HTTP_204_NO_CONTENT)

后一个代码未经测试,仅用于理论目的。它非常不安全,不打算在生产中执行,因为这是个坏主意

我宁愿用最短的方法。在

我的结论是:学习ORM!如果因为数据库已经存在而需要尊重它,那么可以使用managed模型。但总是。。。使用ORM和Django和DRF提供的特性。在

Django REST框架是为与Django框架一起工作而设计的。Django-ORM是Django框架不可分割的一部分。当然,在不使用ORM的情况下使用Django和DRF是可能的,但是您将基本上是在与框架抗争,而不是使用框架来帮助您。你有三种基本方法。在

  1. 如果您只想在python中开发restfulapi并从现有的MySQL数据库中提取数据,或者您没有数据库,但您想要一些简单的东西。您可以使用与框架无关的东西,比如不安的(http://restless.readthedocs.io/en/latest/)甚至拥抱(https://github.com/timothycrosley/hug

  2. 如果您没有任何现有数据,并且想要一个完整的web框架,那么您应该考虑使用Django(我以Django开发人员的身份为生,这一点也不丢人),并接受ORM。在这种情况下,DRF是目前Django更好的REST框架之一。

  3. 如果您有现有的数据库并且不知何故坚持使用Django,有一些方法可以将Django ORM用于现有数据,您应该查看主题为(https://docs.djangoproject.com/en/1.9/howto/legacy-databases/

相关问题 更多 >