Django DRF - 在 api webview 中“隐藏用户”(必填字段)

时间:2021-04-08 15:19:57

标签: django django-rest-framework django-rest-viewsets

我有一个简单的模型:

class Store(models.Model):
    name = models.CharField("address", max_length = 128, null = True, blank = True)
    open = models.PositiveIntegerField("status", default = 1, choices = [(0,0), (1,1)])
    user = models.OneToOneField(User, on_delete = models.CASCADE, )
    

使用简单的序列化程序:

class StoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Store
        fields = ["open", "user"]

视图:

class StateViewSet(viewsets.ModelViewSet):
    serializer_class = StoreSerializer
    http_method_names = ['get', 'put', 'head']
    authentication_classes = [SessionAuthentication,]
    permission_classes = [IsAuthenticated,]

    def list(self, request):
        usr = request.user
        stores = Store.objects.filter(user = usr)
        return Response(stores.values_list("name", flat = True))

    def put(self, request):
        usr = request.user
        Store.objects.filter(user = usr).update(state = request.data["state"])
        return Response("updated")

enter image description here

我想要的是,去掉 user 字段——无论如何只有当前用户可以改变状态,所以它已经是一个预设值。我知道我省略了名称,因为它是 null = True, blank = True,但是我如何将 user 预设为 request.user 并让下拉菜单消失?

1 个答案:

答案 0 :(得分:1)

可以在serializer类的Meta选项中设置read_only_fields

class StoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Store
        fields = ["open", "user"]
        read_only_fields = ("user",)

请注意,这只会从 HTML 表单中排除/隐藏 user,不会进行预设。