为什么你会使用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