Django DRF:通过路由器在模型中选择字段的简单交换机
我想建立一个Django DRF:通过路由器在模型中选择字段的简单交换机,django,django-rest-framework,django-views,Django,Django Rest Framework,Django Views,我想建立一个APIView,可以在商店里打开电源,也就是说。。。 我可以用路由器吗 型号: class Store(models.Model): C = [(0,0), (1,1), (2,2), (3,3)] name = models.IntegerField("name", max_length=60) power_state = models.PositiveIntegerField("current state", def
APIView
,可以在商店里打开电源,也就是说。。。
我可以用路由器吗
型号:
class Store(models.Model):
C = [(0,0), (1,1), (2,2), (3,3)]
name = models.IntegerField("name", max_length=60)
power_state = models.PositiveIntegerField("current state", default=0, choices=C)
user = models.ForeignKey(User, on_delete=models.CASCADE)
视图:
我是DRF新手,不知道这里是否需要序列化程序。我看到的界面如下所示:
当我希望在0和…之间有一个简单的下拉列表时。。。3在这种情况下。另外,路由器
必须如何注册?现在,我在URL.py中放置了一个路径:
path('test/', views.OnOff.as_view(), name = "on-off"),
这意味着它不会被列在127.0.0.1:8000/api/
下,这会很好
我尝试使用(但404):
DRF路由器生成REST样式的URL,并且该API在标准意义上似乎不是REST-ful。例如,列出所有对象并详细说明单个对象
要使用路径方法添加/api/:
path('api/test/', views.OnOff.as_view(), name = "on-off"),
如果希望通过内置接口快速使API工作,请添加post方法
class OnOff(APIView):
def post(self, request):
store = Store.objects.get(pk = request.user.id)
... sudo code to save the on-off value sent from the interface ...
store.power_state = request.data.get('on-off', 0)
store.save()
return Response("switched")
要使用DRF路由器,需要一个视图集
router.url
propertyu是可以包含在主url.py中的url列表
url.py
from rest_framework.routers import DefaultRouter
import .views
app_name = 'on-off'
router = DefaultRouter()
router.register(r'onoff', views.OnOffViewset)
urlpatterns = router.urls
class OnOffViewset(viewsets.ViewSet):
def update(self, request, pk=None):
# in this case the pk is a user.id
store = Store.objects.get(pk = request.user.id)
... sudo code to save the on-off value sent from the interface ...
store.power_state = request.data.get('on-off', 0)
store.save()
return Response({'status': store.power_state})
视图.py
from rest_framework.routers import DefaultRouter
import .views
app_name = 'on-off'
router = DefaultRouter()
router.register(r'onoff', views.OnOffViewset)
urlpatterns = router.urls
class OnOffViewset(viewsets.ViewSet):
def update(self, request, pk=None):
# in this case the pk is a user.id
store = Store.objects.get(pk = request.user.id)
... sudo code to save the on-off value sent from the interface ...
store.power_state = request.data.get('on-off', 0)
store.save()
return Response({'status': store.power_state})
项目主URL.py
路径('api/',include('onoff.url',namespace='on-off'),我会试试,谢谢。您还可以告诉我如何使用router.register()
方法添加api吗(我已经实现了path
方法,但从我的帖子中可能还不清楚。您建议update
更新存储的单个记录(power\u state
)。请帮助我理解:当我按照您建议的方式实施路由器
时,路由不会显示在/api/
概览页面中。我想这是因为没有定义。我定义了获取查询集
方法,但路由不会显示-如果我通过url调用它(/api/onoff/
)我可以在404消息中看到,DRF查找-detail
视图:^api/^onoff/(?P[^/]+)\(?P[a-z0-9]+)/?$[name='onoff-detail']
。非常感谢您的hep!DRF还需要基本名称
。您是否在项目的主要url模式中包含了apps url.py?当我包含path('api/)时,请包含('appname.urls',namespace='appname')
(我在应用程序url.py
中使用了app_name=
appname')在项目url.py
中我遇到了两个问题:127.0.0.1:8000/api
现在指向主页面,(我仍然可以使用正确的结束路径调用api)DRF仍然希望我为路由器提供基本名称
——而且已经有路径(''',include('appname.url'))
。路由器不会自动添加/api/。只需包含一次,但可以随意添加路径。