爲什麼你會使用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給你的功能。
您需要更改您的models.py和運行'./manage.py makemigrations'和'./manage.py migrate'和你的數據庫會根據您的車型變化而變化。 – marcusshep