[英]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:然后,我输入
orange
到Name: 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:然后,如果你输入
orange
到Name: 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.