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 的自动分页