なぜ(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の両方からあなたに与えられた機能を使用してください。
あなたはmodels.pyを変更し、 './manage.py makemigrations'と' ./manage.py migrate'を実行する必要があり、データベースはあなたのモデルの変更に応じて変更されます。 – marcusshep