如何在Django REST框架中向ModelViewSet传递多个变量?
我正在使用 Django REST框架
我遇到的情况是,我想传递两个或更多的变量,然后根据这些变量从数据库中获取数据。在下面的代码中,只有一个叫做pk的变量,我想用数据库中的另外两个字段来替换它。
另外,请告诉我如何写我的url配置。
Views.py
class ExampleViewSet(viewsets.ReadOnlyModelViewSet):
model = myTable
def list(self, request):
queryset = myTable.objects.all()
serializer = mySerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
queryset = myTable.objects.all()
s = get_object_or_404(queryset, pk=pk)
serializer = mySerializer(s)
return Response(serializer.data)
Serializer.py
class Serializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = myTable
fields = ('attr1', 'attr2', 'attr3')
3 个回答
-1
urls.py
url(
regex=r'^teach/(?P<pk>\d+?)/(?P<pk1>\d+?)/$',
view=teach_update.as_view(),
name='teach'
)
这个文件是用来定义你的网站里每个页面的地址(URL)的。简单来说,它就像是一个地图,告诉网站用户每个页面在哪里。
Templates
<td><a href="/teach/{{tid}}/{{i.id}}"><button type="button" class="btn
btn-warning">Update</button></a></td>
模板文件是用来设计网页外观的。你可以把它想象成网页的“衣服”,它决定了网页的样子和布局。通过模板,你可以把数据和内容展示得更好看。
Views.py
class teach_update(view):
def get(self,request,**kwargs):
dist=self.kwargs['pk']
ddd=self.kwargs['pk1']
这个文件负责处理用户请求和返回响应。可以理解为它是网站的“大脑”,当用户访问某个页面时,views.py会决定要显示什么内容,并把这些内容送给用户。
14
下面是如何使用最近的 Django REST Framework 来实现这个功能。
假设你的变量在资源的 URL 中是这样的:
GET /parent/:id/child/
GET /parent/:id/child/:id/
那么:
在 urls.py 文件中:
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'parent/(?P<parent_id>.+)/child', views.ExampleViewSet)
urlpatterns = router.urls
在 views.py 文件中:
class ExampleViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = Serializer
def get_queryset(self):
parent = self.kwargs['parent']
return myTable.objects.filter(parent=parent)
这里的 'parent' 在查询集部分是指你的父对象。你可能需要稍微调整一下,当然,但这个思路是通过 kwargs 来实现的。
这个方法还可以帮你减少一些代码,你只需通过继承就可以把它变成一个完整的 ModelViewSet
。
希望这对你有帮助。
更多信息请查看: DRF 根据 URL 进行过滤。
4
这里有一个例子,展示了你可以如何实现你想要的功能:
class ExampleViewSet(viewsets.ReadOnlyModelViewSet):
# This code saves you from repeating yourself
queryset = myTable.objects.all()
serializer_class = mySerializer
def list(self, request, *args, **kwargs):
# Get your variables from request
var1 = request.QUERY_DICT.get('var1_name', None) # for GET requests
var2 = request.DATA.get('var2_name', None) # for POST requests
if var1 is not None:
# Get your data according to the variable var1
data = self.get_queryset().filter(var1)
serialized_data = self.get_serializer(data, many=True)
return Response(serialized_data.data)
if var2 is not None:
# Do as you need for var2
return Response(...)
# Default behaviour : call parent
return super(ExampleViewSet, self).list(request, *args, **kwargs)
def retrieve(self, request, *args, **kwargs):
# Same for retrieve
# 1. get your variable xyz from the request
# 2. Get your object based on your variable's value
s = myTable.objects.get(varX=xyz)
# 3. Serialize it and send it as a response
serialized_data = self.get_serializer(s)
return Response(serialized_data.data)
# 4. Don't forget to treat the case when your variable is None (call parent method)
至于urlconf,这取决于你想要如何发送你的变量(可以通过get、post或者直接在网址中发送)。
希望这对你有帮助。