简体   繁体   English

在 Django Admin 中覆盖“response_change()”时如何删除无用的“UPDATE”查询?

[英]How to remove a useless "UPDATE" query when overriding "response_change()" in Django Admin?

In FruitAdmin(): , I overrode response_change() with the code to capitalize the name which a user inputs on Change fruit as shown below:FruitAdmin():中,我用代码覆盖了response_change()以大写用户在Change fruit上输入的名称,如下所示:

# "store/admin.py"

from django.contrib import admin
from .models import Fruit

@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):

    def response_change(self, request, obj): # Here
        obj.name = obj.name.upper()
        obj.save()
        return super().response_change(request, obj)

Then, I input orange to Name: on Change fruit as shown below:然后,我输入orangeName: on Change fruit如下图:

在此处输入图像描述

Then, the name was successfully changed from APPLE to ORANGE capitalized as shown below:然后,名字就成功的从APPLE变成了大写的ORANGE ,如下图:

在此处输入图像描述

But according to PostgreSQL logs, there is a useless UPDATE query as shown below.但是根据 PostgreSQL 日志,有一个无用的UPDATE查询,如下所示。 *I use PostgreSQL and you can check On PostgreSQL, how to log queries with transaction queries such as "BEGIN" and "COMMIT" : *我使用PostgreSQL ,您可以查看On PostgreSQL,如何使用“BEGIN”和“COMMIT”等事务查询记录查询

在此处输入图像描述

So, how can I remove the useless UPDATE query as shown above?那么,我怎样才能删除上面显示的无用的UPDATE查询呢?

In FruitAdmin(): , you also need to override save_model() like below so that obj.save() works only when adding data on Add fruit .FruitAdmin():中,您还需要覆盖save_model()如下所示,以便obj.save()仅在添加数据时才起作用Add fruit * obj.save() is really important: * obj.save()非常重要:

# "store/admin.py"

from django.contrib import admin
from .models import Fruit

@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):

    def response_change(self, request, obj):
        obj.name = obj.name.upper()
        obj.save()
        return super().response_change(request, obj)

    def save_model(self, request, obj, form, change): # Here
        last_part_of_path = request.path.split('/')[-2]

        if last_part_of_path == "add":
            obj.save() # Here

Then, if you input orange to Name: on Change fruit as shown below:然后,如果你输入orangeName: on Change fruit如下图:

在此处输入图像描述

Then, the name is successfully changed from APPLE to ORANGE capitalized as shown below:然后,名字就成功的从APPLE变成了大写的ORANGE如下图:

在此处输入图像描述

Then, the useless UPDATE query is removed as shown below:然后,无用的UPDATE查询被删除,如下所示:

在此处输入图像描述

Be careful, if you override save_model() with pass as shown below:请注意,如果您使用pass覆盖save_model() ,如下所示:

# "store/admin.py"

from django.contrib import admin
from .models import Fruit

@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):

    def response_change(self, request, obj):
        obj.name = obj.name.upper()
        obj.save()
        return super().response_change(request, obj)

    def save_model(self, request, obj, form, change): # Here
        pass # Here

You cannot add data on Add fruit while you can change data on Change fruit :您不能在Add fruit上添加数据,而您可以在Change fruit上更改数据:

在此处输入图像描述

But, if you really want to override save_model() with pass and want to add and change data, you also need to override response_add() with obj.save() as shown below.但是,如果你真的想用pass覆盖save_model()并想添加和更改数据,你还需要用obj.save()覆盖response_add() ,如下所示。 *Again obj.save() is really important: *再次obj.save()非常重要:

# "store/admin.py"

from django.contrib import admin
from .models import Fruit

@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):

    def response_change(self, request, obj):
        obj.name = obj.name.upper()
        obj.save()
        return super().response_change(request, obj)

    def save_model(self, request, obj, form, change):
        pass

    def response_add(self, request, obj, post_url_continue=None): # Here
        obj.save() # Here
        return super().response_add(request, obj, post_url_continue)

Then, you can add data on Add fruit as show below:然后,您可以在添加水果上添加数据,如下所示:

在此处输入图像描述

In addition, if you also want to capitalize the name which a user inputs on Add fruit as shown below:另外,如果你还想将用户在添加水果时输入的名称大写,如下所示:

在此处输入图像描述

You need to add obj.name = obj.name.upper() to response_add() as shown below:您需要将obj.name = obj.name.upper()添加到response_add()中,如下所示:

# "store/admin.py"

from django.contrib import admin
from .models import Fruit

@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):

    def response_change(self, request, obj):
        obj.name = obj.name.upper()
        obj.save()
        return super().response_change(request, obj)

    def save_model(self, request, obj, form, change):
        pass

    def response_add(self, request, obj, post_url_continue=None): # Here
        obj.name = obj.name.upper() # Here
        obj.save()
        return super().response_add(request, obj, post_url_continue)

Or, you only need to override save_model() like below without response_change() and response_add() :或者,您只需要像下面这样覆盖save_model()而无需response_change()response_add()

# "store/admin.py"

from django.contrib import admin
from .models import Fruit

@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change): # Here
        obj.name = obj.name.upper()
        obj.save() 

Then, you can capitalize the name which a user inputs on Add fruit as show below:然后,您可以将用户在添加水果上输入的名称大写,如下所示:

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM