2016-08-03 4 views
0

Ich bin neu in Django-Rest Framework und ich wollte API-Aufrufe entwickeln. Ich verwende derzeit Mysql-Datenbank, also wenn ich Änderungen in der Datenbank vornehmen muss, muss ich Modelle in meinem Projekt schreiben oder kann ich die Rohdatenoperation auf meine Datenbank ausführen.Verwenden von Modellen in Django-Rest Framework

Like: Dies ist meine urls.py-Datei, die eine Liste von URLs enthält und wenn eine der URL getroffen wird es ruft direkt Funktion in views.py Datei anzuzeigen und Ruhe ich, dass die bestimmte Operation tun Funktion, wie Verbindung mit MySQL-Datenbank, Ausführen von SQL-Abfragen und Zurückgeben von JSON-Antwort an das Frontend.

Ist dies ein guter Ansatz, um API-Aufrufe zu tätigen? Wenn nicht, bitte führe mich.

Jeder Rat oder jede Hilfe wird geschätzt.

+0

Sie müssen die Änderungen an Ihrem models.py vornehmen und './manage.py makemigrations' und' ./manage.py migrieren' ausführen und Ihre Datenbank ändert sich entsprechend den Änderungen in Ihren Modellen. – marcusshep

Antwort

1

Sie nicht müssen Modelle verwenden, aber Sie sollten wirklich. Djangos ORM-Funktionalität (die Art, wie es das Lesen/Schreiben in Datenbanken behandelt) ist fantastisch und sehr nützlich.

Wenn Sie rohe SQL-Anweisungen die ganze Zeit ausführen, haben Sie entweder einen sehr spezifischen Fall, in dem Djangos Funktionen fehlschlagen, oder Sie verwenden Django ineffizient und sollten überdenken, warum Sie Django verwenden.

0

Django REST Framework wurde entwickelt, um mit Django Framework zu arbeiten. Und Django ORM ist ein wesentlicher Bestandteil von Django Framework. Zugegeben, es ist möglich, Django und DRF ohne Verwendung von ORM zu verwenden, aber Sie werden im Grunde gegen das Framework kämpfen, anstatt das Framework zu benutzen, um Ihnen zu helfen. Also, Sie haben drei grundlegende Ansätze.

  1. Wenn alles, was Sie wollen, ist RESTful APIs in Python zu entwickeln und ziehen Daten aus einer vorhandenen MySQL-Datenbank oder Sie haben keine Datenbank, aber Sie wollen etwas einfach. Sie können etwas Rahmen Agnostiker, wie unruhig (http://restless.readthedocs.io/en/latest/) oder sogar umarmen (https://github.com/timothycrosley/hug)

  2. Wenn Sie alle vorhandenen Daten nicht verwenden, und Sie wollen nun einen kompletten Web-Framework, sollten Sie mit Django betrachten (ich verdiene mein Geld als ein Django-Entwickler, gibt es keine Schande in diesem) und umarmen das ORM. In diesem Fall ist DRF im Moment eines der besseren REST-Frameworks für Django.

  3. Wenn Sie Datenbank haben bestehende und irgendwie mit der Verwendung von Django stecken, gibt es einige Möglichkeiten, Django ORM mit vorhandenen Daten zu verwenden, müssen Sie bei Django docs zum Thema aussehen sollte (https://docs.djangoproject.com/en/1.9/howto/legacy-databases/)

0

Warum Würden Sie Django verwenden, ohne die Datenbank mit dem ORM zu treffen? Die meisten der Zeit die ORM funktioniert wie man es erwarten würde, und sogar erlauben Sie sucht wie folgt auszuführen:

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

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

Und eine Abfrage wie folgt durchführen:

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

, die die gleiche sein würde, aber besser, als:

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' 

Kürzer und wartungsfähiger.

Nun zu Django Rest Framework und Django im Allgemeinen: Obwohl die letzten Änderungen sowohl an Django als auch an DRF beteiligt sind, kann man nicht plötzlich erwarten, dass verschachtelte Objekte im selben Moment erstellt werden (zB Foo ist übergeordnet, während Bar ist geschachtelt), wie es in Relation Managern (Django) passiert und Methoden in der ModelSerializer Klasse erstellen und aktualisieren, können Sie immer noch Django vertrauen, um Ihre Zeit, Mühe und Leben zu sparen, indem Sie es anstelle von SQL verwenden.

Ich werde Ihnen ein Beispiel mit DRF geben. Wir gehen davon aus, dass nur Foo-Modelle beteiligt sind. Welchen würdest du bevorzugen?

# 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... 

oder ...

# 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) 

letzteres Code ist nicht getestet und dient nur zur teoretical Zweck. es ist ziemlich unsicher und nicht dazu bestimmt, in der Produktion ausgeführt zu werden, da es eine schlechte Idee ist

Ich würde mit dem kürzesten Ansatz bevorzugen.

Mein Fazit ist: Lernen Sie das ORM! Wenn Sie Ihre Datenbank respektieren müssen, weil sie bereits vorhanden ist, können Sie managed Modelle verwenden. Aber immer ... benutze das ORM und die Funktionen, die dir von Django und DRF gegeben wurden.