2016-08-03 11 views
0

Django-Rest Frameworkの初心者です。私はAPIコールを開発したいと思っていました。 私は現在Mysqlデータベースを使用していますので、データベースを変更する必要がある場合は、プロジェクトにモデルを書き込む必要がありますか、データベースに生データ操作を実行できますか?Django-Rest Frameworkでのモデルの使用

同様: これは、URLのリストが含まれており、URLのいずれかが をヒットした場合、それは直接views.pyファイル内の関数の存在を確認し、私はその中で特定の操作を行う休ませる呼び出して、私のurls.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 FrameworkはDjango Frameworkと連携するように設計されています。そして、Django ORMはDjango Frameworkの不可欠な部分です。確かに、ORMを使用せずにDjangoとDRFを使用することは可能ですが、フレームワークを使用する代わりに基本的にフレームワークと戦うことになります。したがって、3つの基本的なアプローチがあります。

  1. あなたが望むすべてはPythonでRESTfulなAPIを開発し、既存のMySQLデータベースからデータを取得する場合、またはデータベースを持っていないが、あなたは、単純な何かをしたい場合。あなたが任意の既存のデータを持っていないとあなたが本格的なWebフレームワークをしたい場合は、ジャンゴを使用して検討すべきである(https://github.com/timothycrosley/hug

  2. 落ち着き(http://restless.readthedocs.io/en/latest/)あるいは抱擁のように、とらわれない何かのフレームワークを使用することができます(私は私の生活を作りますDjangoの開発者として、これには残念なことではありません)、ORMを受け入れます。この場合、DRFは現時点でDjangoにとって優れたRESTフレームワークの1つです。

  3. データベースが既に存在し、何とかジャンゴを使用して立ち往生している場合は、既存のデータとDjangoのORMを使用するいくつかの方法がありますが、あなたは

0

なぜ(https://docs.djangoproject.com/en/1.9/howto/legacy-databases/)トピックにDjangoのドキュメントをご覧くださいあなたはDjangoを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, ...) 

をそして、このようなクエリを実行:ORMはあなたが期待する、とも、あなたがこのように検索を実行することを可能にしたいと働く倍の大半

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 FrameworkとDjangoについて一般的に言えば、DjangoとDRFの両方に対する後者の修正では、親オブジェクトが同じ瞬間にネストされたオブジェクトが作成されることを突然期待できません。関係マネージャ(Django)で発生し、ModelSerializerクラスのメソッドを作成/更新するので、SQLの代わりにDjangoを使用して時間、労力、人生を節約できます。

私はあなたに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の両方からあなたに与えられた機能を使用してください。

関連する問題