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/。只需包含一次,但可以随意添加路径。