2016-08-03 98 views
0

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

赞: 这是我的urls.py文件,它包含一个URL列表,如果有任何URL被点击,它会直接调用view.py文件中的函数来查看,然后我会执行那个特定的操作函数,如连接到MySQL数据库,执行SQL查询并将JSON响应返回到前端。

这是制作API调用的好方法吗?如果不是请引导我。

任何意见或帮助将不胜感激。

+0

您需要更改您的models.py和运行'./manage.py makemigrations'和'./manage.py migrate'和你的数据库会根据您的车型变化而变化。 – marcusshep

回答

1

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

如果你一直在执行原始的sql语句,你可能会有一个非常特殊的情况,在这里django的函数会失败,或者你使用的是django效率低下,应该重新考虑你为什么要用django开始。

0

Django REST框架旨在与Django框架一起使用。 Django ORM是Django Framework的一个组成部分。诚然,可以在不使用ORM的情况下使用Django和DRF,但是您基本上将对抗框架而不是使用框架来帮助您。所以,你有三种基本方法。

  1. 如果你想要的是开发RESTful API中的蟒蛇,并从现有的MySQL数据库中提取数据,或者你没有一个数据库,但是你想要的东西简单。如果你没有任何现有的数据,你想要一个完整的Web框架,你应该考虑使用Django(我的生活作为一个Django的开发者,这里没有什么耻辱)并且拥抱ORM。在这种情况下,DRF是目前Django更好的REST框架之一。

  2. 如果您现有的数据库,并在某种程度上坚持使用Django,也有一些方法来使用Django ORM与现有的数据,你应该看看Django文档的主题(https://docs.djangoproject.com/en/1.9/howto/legacy-databases/

0

为什么你会使用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, ...) 

,并执行这样的查询:

Bar.objects.get(code='baz', foo_code='bat') 

这将是相同的,但更好,比:

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框架和Django的一般情况:虽然后面对Django和DRF的修改都涉及到你不能突然期望嵌套对象是在父对象被创建的同一时刻创建的(例如Foo是parent,而Bar是嵌套的),因为它在关系管理(Django的情况),并创建在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) 

后者代码是未经测试,仅提供了teoretical目的。这是非常不安全的,不打算在生产中执行,因为这是一个坏主意

我会用最短的办法喜欢。

我的结论是:学习ORM!如果你需要尊重你的数据库,因为它是预先存在的,你可以使用managed模型。但总是......使用ORM和Django和DRF给你的功能。

相关问题