通过Django REST POST

时间:2017-11-13 20:06:18

标签: python django django-models django-rest-framework

我有一个模特"作业"我希望能够通过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表单,我也无法弄清楚如何回复。我希望能够过滤到单个实例并编辑单个字段,让我们说" assignment.name"现在。

我理解......

  

ModelViewSet类提供的操作是.list(),. retrieve(),. create(),. update(),. partial_update()和.destroy()。 (DRF Docs

那么我需要做些什么才能利用它们通过url编辑模型实例?或者老实说,只需编辑一个时期。我一直在尝试不同的Mixins,视图(UpdateAPIView,RetrieveUpdateAPIView等)和特别是Stack Overflow: Django Rest Framework update field这个问题。

1 个答案:

答案 0 :(得分:1)

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

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

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