【问题标题】:Django change value before save in ModelViewSetDjango在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

【问题讨论】:

标签: django django-rest-framework


【解决方案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 文件。这可能意味着您的数据根本没有保存在数据库中。

【讨论】:

  • 这是对我问题的回答吗?管理站点工作正常。我只是想在保存之前更新一个值
猜你喜欢
  • 2022-01-23
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多