Django在ModelViewSet中保存之前更改值

Posted

技术标签:

【中文标题】Django在ModelViewSet中保存之前更改值【英文标题】:Django change value before save in ModelViewSet 【发布时间】:2021-01-12 17:27:08 【问题描述】:

我是 Django(和 REST 框架)的新手,但我正在努力在保存之前更新一个值。现在我正在使用一个简单的 ModelViewSet 来更新记录。一切正常,但如果我在管理站点中创建项目,则值不会更新。

视图代码如下:

class OauthProviderViewSet(viewsets.ModelViewSet):
    queryset = OauthProvider.objects.all()
    serializer_class = OauthProviderSerializer 
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    permission_classes = [IsAdminUser]

    def perform_create(self, serializer):
        changed_credentials = "test" + self.request.credentials
        serializer.save(credentials=changed_credentials)

我只想在凭据字段前添加单词 test。

编辑:建议发表一篇文章,解释序列化程序的 create 和模型的 create 函数之间的区别。有趣的是 1. 我不明白其中的区别,但是 2. 他们都没有工作。

EDIT2:用我发现的东西在序列化程序中尝试,一切正常,但我的 sn-p 没有执行:

class OauthProviderSerializer(serializers.ModelSerializer):
    class Meta:
        model = OauthProvider
        #fields = ['id', 'title', 'author']
        fields = "__all__"

    def create(self, instance, validated_data):
        validated_data['credentials'] = "test" + validated_data['credentials']
        return super(OauthProviderSerializer, self).create(validated_data)

EDIT3:我发现了问题(部分)。我正在使用管理屏幕来创建值,但该功能不使用视图或序列化程序。如果我使用普通的 POST 方法,我的代码就会被执行。

我对这个功能最好更新 ModelViewSet 的 perform_create 方法是对的吗?根据这个网址:https://simpleisbetterthancomplex.com/tutorial/2019/04/07/how-to-save-extra-data-to-a-django-rest-framework-serializer.html

【问题讨论】:

"update a value before save"...你为什么不在序列化器中做事? 告诉我怎么做,我会怎么做 :) 就像我说的,我是新人 参考 DRF 文档:django-rest-framework.org/api-guide/serializers/… 这能回答你的问题吗? When to use Serializer's create() and ModelViewset's create() perform_create() 我已经找到了这两个链接,但我对 django 太陌生了,这让我眼花缭乱。我很抱歉。你能提供一个sn-p吗? 【参考方案1】:

每次在 models.py 文件中创建新模型时,都必须导入该模型

admin.py 文件中的模型,并对其应用注册方法。

在 admin.py 中导入所有模型。像这样:

from .models import * #即从文件models.py中导入所有模型。

admin.site.register(OauthProviderViewSet) #然后应用注册方法。

然后您将能够在您的 admin.py 文件中看到 OauthProviderViewSet 模型。

如果您已经这样做了,并且可以在管理页面中看到您的模型,

那么每次您从管理页面创建项目时,您都必须将它们保存在

命令 Django 更新数据库。

如果您想从表单更新您的项目(在模板 => html 文件中

由views.py文件中的函数渲染)并且它不工作那么你的有问题

views.py 文件。这可能意味着您的数据根本没有保存在数据库中。

【讨论】:

这是对我问题的回答吗?管理站点工作正常。我只是想在保存之前更新一个值

以上是关于Django在ModelViewSet中保存之前更改值的主要内容,如果未能解决你的问题,请参考以下文章

将 django-rest-framework 中的超链接添加到 ModelViewSet

Django rest框架:防止一个用户删除/编辑/查看ModelViewSet中的其他用户

Django Rest Framework ModelViewSet 视图没有从数据表中看到 CSRFToken

关闭 Django Rest Framework ModelViewSet 的自动分页

Django Rest Framework:在 ViewSet 上打开分页(如 ModelViewSet 分页)

如何使用 django-filters 过滤 ModelViewSet 中的自定义 url