2016-08-03 45 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給你的功能。