我有一个模型“Assignment”,我希望能够通过api更新 .
每条评论更新
urls.py
router = routers.DefaultRouter()
router.register(r'assignments', views.AssignmentList, base_name='Assignments')
urlpatterns = [
url(r'^api/v1/', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
serializers.py
class AssignmentSerializer(serializers.ModelSerializer):
class Meta:
model = Assignment
fields = (
'id', 'company', 'farm', 'sensor', 'name', 'location', 'notes', 'units', 'max_height', 'frequency',
'interval', 'max_threshold', 'min_threshold', 'notify', 'last_alert_time', 'last_alert_water_level')
views.py
class AssignmentList(viewsets.ModelViewSet):
serializer_class = AssignmentSerializer
pagination_class = None
def get_queryset(self):
queryset = Assignment.objects.all()
company_id = self.request.query_params.get('company_id', None)
sensor_id = self.request.query_params.get('sensor_id', None)
if company_id is not None:
queryset = Assignment.objects.filter(company_id=company_id)
if sensor_id is not None:
queryset = Assignment.objects.filter(sensor_id=sensor_id)
return queryset
目前,我的视图允许基于两个字段“company_id”和“sensor_id”轻松过滤 . 这允许在json中轻松访问数据 . 不幸的是,即使使用内置的API表单,我也无法弄清楚如何POST回来 . 我希望能够过滤到单个实例并编辑单个字段,现在就说“assignment.name” .
这是我的理解......
ModelViewSet类提供的操作是.list(),. retrieve(),. create(),. update(),. partial_update()和.destroy() . (DRF文件)
那么我需要做些什么才能利用它们通过url编辑模型实例?或者老实说,只需编辑一个时期 . 我一直在圈子里尝试不同的Mixins,视图(UpdateAPIView,RetrieveUpdateAPIView等)和这个问题,特别是Stack Overflow: Django Rest Framework update field .
1 回答
为什么你缺少所需的外键字段完全是个问题 .
原因是可能是您的字段被称为
company
,farm
和sensor
,而不是company_id
等 . 因为底层数据库字段被称为company_id
等等,DRF会将它们检测为模型上的只读属性,因此您可以指定这些名称在字段元组中没有显示错误,但不显示可浏览API中的字段 . 更改fields
元组以包含Django字段的实际名称 .另请注意,由于您使用的是HyperlinkedModelSerializer,DRF需要为这些相关模型提供链接的ViewSet . 如果您没有定义那些,请将其设置为基本的ModelSerializer .