如何在路由器上注册一个视图(不是视图集)?
我正在使用Django REST框架,并且一直在尝试创建一个返回少量信息的视图,并将其注册到我的路由器上。
我有四个存储信息的模型,并且所有模型都有一个created_time
字段。我正在尝试创建一个视图,该视图created_time
在单个视图中返回最新的对象(基于),其中仅返回四个创建时间。
因此,视图中可能的JSON输出看起来像
{ "publish_updatetime": "2015.05.20 11:53",
"meeting_updatetime": "2015.05.20 11:32",
"training_updatetime": "2015.05.20 15:25",
"exhibiting_updatetime": "2015.05.19 16:23"
}
我也希望在路由器上注册该视图,以便在加载API根目录时它与其余的端点一起出现。
router.register(r'updatetime', views.UpdateTimeView)
这是我尝试使用的四个模型
class Publish(models.Model): user = models.ForeignKey(MyUser)
name = models.CharField(max_length=50)
created_time = models.DateTimeField( default=datetime.now)
class Meeting(models.Model):
user = models.ForeignKey(MyUser)
name = models.CharField(max_length=50)
file_addr = models.FileField(upload_to=get_file_path)
created_time = models.DateTimeField(default=datetime.now)
class Training(models.Model):
user = models.ForeignKey(MyUser)
name = models.CharField(max_length=50)
image = models.ImageField(upload_to=get_file_path, max_length=255)
created_time = models.DateTimeField(default=datetime.now)
class Exhibiting(models.Model):
user = models.ForeignKey(MyUser)
name = models.CharField(max_length=50)
file_addr = models.FileField(upload_to=get_file_path)
created_time = models.DateTimeField(default=datetime.now)
是否有可能做到这一点?怎么做?
回答:
路由器可与一起使用ViewSet
,并且不是为普通视图设计的,但这并不意味着你不能在普通视图中使用它们。通常,它们与模型(和ModelViewSet
)一起使用,但在不使用它们的情况下,也可以使用GenericViewSet
(如果通常使用GenericAPIView
)和ViewSet
(如果仅使用APIView
)使用它们。
对于列表视图,请求方法映射到这样的ViewSet
方法
GET
->list(self, request, format=None)
POST
->create(self, request, format=None)
对于详细视图(URL中带有主键),请求方法使用以下映射
GET
->retrieve(self, request, pk, format=None)
PUT
->update(self, request, pk, format=None)
PATCH
->partial_update(self, request, pk, format=None)
DELETE
->destroy(self, request, pk, format=None)
因此,如果要在路由器上的视图中使用这些请求方法中的任何一种,则需要覆盖正确的视图方法(因此,list()而不是get())。
现在,特别是在你的情况你会正常使用的APIView
,看上去像
class UpdateTimeView(APIView): def get(self, request, format=None):
latest_publish = Publish.objects.latest('created_time')
latest_meeting = Meeting.objects.latest('created_time')
latest_training = Training.objects.latest('created_time')
latest_exhibiting = Exhibiting.objects.latest('created_time')
return Response({
"publish_updatetime": latest_publish.created_time,
"meeting_updatetime": latest_meeting.created_time,
"training_updatetime": latest_training.created_time,
"exhibiting_updatetime": latest_exhibiting.created_time,
})
可比的ViewSet
是
class UpdateTimeViewSet(ViewSet): def list(self, request, format=None):
latest_publish = Publish.objects.latest('created_time')
latest_meeting = Meeting.objects.latest('created_time')
latest_training = Training.objects.latest('created_time')
latest_exhibiting = Exhibiting.objects.latest('created_time')
return Response({
"publish_updatetime": latest_publish.created_time,
"meeting_updatetime": latest_meeting.created_time,
"training_updatetime": latest_training.created_time,
"exhibiting_updatetime": latest_exhibiting.created_time,
})
注意两个必需的更改:APIView-> ViewSet
和get-> list
。我还更新了名称,以表明它不仅仅是普通视图(因为ViewSet
不能以相同的方式初始化),但这不是必需的。
因此,有了这个新视图,你可以像其他任何方法一样在路由器中注册它。你需要在base_name此处创建一个url名称(通常会从queryset中提取)。
router.register(r'updatetime', views.UpdateTimeViewSet, base_name='updatetime')
因此,现在updatetime
可以在API根目录中使用该端点了,你只需调用端点即可获得最新时间(一个简单的GET请求)。
以上是 如何在路由器上注册一个视图(不是视图集)? 的全部内容, 来源链接: utcz.com/qa/420275.html