首页 文章

通过Django REST POST更新模型实例

提问于
浏览
1

我有一个模型“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 回答

  • 1

    为什么你缺少所需的外键字段完全是个问题 .

    原因是可能是您的字段被称为 companyfarmsensor ,而不是 company_id 等 . 因为底层数据库字段被称为 company_id 等等,DRF会将它们检测为模型上的只读属性,因此您可以指定这些名称在字段元组中没有显示错误,但不显示可浏览API中的字段 . 更改 fields 元组以包含Django字段的实际名称 .

    另请注意,由于您使用的是HyperlinkedModelSerializer,DRF需要为这些相关模型提供链接的ViewSet . 如果您没有定义那些,请将其设置为基本的ModelSerializer .

相关问题