首页 > 解决方案 > django rest 框架:是否可以在不使用主键的情况下创建放置/补丁请求?

问题描述

我想从使用 put http 方法获得的数据中更新 2 个字段 is_exempted 和注释。而且我可以从http方法获得多个推荐数据。并且模型没有我可以考虑的字段 pk 对于每个 account_id 可以有多个条目。

模型.py

class Recommendation(models.Model):
    account             = models.ForeignKey(Accounts, on_delete=models.CASCADE)
    account_name        = models.CharField(max_length=255, blank=True, null=True)
    instance_id         = models.CharField(max_length=255, blank=True, null=True)
    month_year          = models.CharField(max_length=50, blank=True, null=True)    
    instance_type       = models.CharField(max_length=255, blank=True, null=True)
    is_exempted         = models.CharField(max_length=50, default='no', null=False)
    comments            = models.CharField(max_length=255, blank=True, null=True)

序列化程序.py

class RecommendationSerializers(serializers.ModelSerializer):

    class Meta:
        model = Recommendation
        fields = ( 'account_id', 'account_name', 'instance_id', 'instance_type', 'is_exempted', 'comments', 'month_year')

视图.py

@api_view(['PUT'])
def update_recommendation_data(request):
    output = []
    if request.method == 'PUT':
        if request.data:
            for d in request.data:
                print(d)
                serializer = RecommendationSerializers(data=d, partial=False)
                if serializer.is_valid():
                    serializer.save()
                output.append(serializer.data)
        return Response(data=output, status=status.HTTP_200_OK)
    return Response(data="BAD REQUEST", status=status.HTTP_400_BAD_REQUEST)

网址.py

router = routers.DefaultRouter()
urlpatterns = [url("^", include(router.urls)),
url(r'^updaterecommendation$', views.update_recommendation_data)]

标签: pythondjangohttpdjango-rest-frameworkrest

解决方案


看了你说的:

并且模型没有我可以考虑的字段 pk 对于每个 account_id 可以有多个条目。

据我了解,您在确定用于单独识别每个建议的密钥时遇到问题。但是你已经有了这样的钥匙,跟着走吧。

根据Django 文档,您的模型已经有一个主键:

会自动添加一个 id 字段,但可以覆盖此行为。请参阅自动主键字段

id因此,您可以通过发送Django 自动生成的字段来过滤它。


推荐阅读