如何进行admin的save_model 改写
本篇文章给大家分享的是有关如何进行admin的save_model 改写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
一、admin 的 save_model 改写
我们后台项目有用到 django的 admin 后台模块,有些配置的功能完全可以通过 django 就可以实现,不用前端再开发管理页面了,但是有些操作需要自定义的,比如我们配置某个小程序的二维码规则,admin 保存配置后需要调取微信端的接口更新对应的配置,admin暴露出来的接口只是将数据保存到数据库功能,实现保存后调取微信 api 接口就要改写 admin 的源码 save_mode 方法了,代码如下:
from django.contrib import admin
# Register your models here.
from index.models import QrCode
class QrCodeAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
content = form.cleaned_data.get("content") # 获取页面表单填写的信息,是个字典类型
try:
now = json.loads(content)
except Exception as e:
raise TypeError("二维码规则配置必须是可以json格式化的")
if change: # (如果资料时新增时,change是False,修改资料时是True)
old = self.get_object(request, obj.id) # 这个方法可以获取没保存之前的对象
old = old.content
old = json.loads(old)
if old != now: # 如果修改二维码参数
# 获取appid
pt_appid_ = AppletServer.objects.filter(qr_code=obj.id).values_list("app_id", flat=True) # 第三方平台appid
set_pt_appid = set(pt_appid_)
apps_id = MiniApp.objects.filter(AppId__in=set_pt_appid).values_list("app_id", flat=True)
for appid in apps_id:
add_qr_code(app_id=appid, json_kwargs=now)
obj.save() # 保存结果
admin.site.register(QrCode, QrCodeAdmin) # 将模型注册到 admin
下图中点击保存时,admin 会调用上面的 save_model法,代码中添加了注释。
二、自定义 model 模型的查询集。
例如,我们原先有个模型 Customer ,之前所有关于 Customer 的查询用的都是 Customer.objects.all() 。但是最近我们有个需求,要给 Customer 加个字段是否为微信默认用户,这样的话,原先关于 Cusomer 查询都要加个过滤条件,这样以前写的关于 Customer 查询的语句代码都要改,要修改很多地方。但是这个可以改写管理类对象方法实现上述需求,就无需改动那么多的代码。效果比如:
Customer.objects.all() 查询不是微信默认用户的 customer
Customer.all_objects.all() 查询所有的customer
代码如下:
class AllCustomerManager(models.Manager):
# 改变查询的结果集
def all(self):
# 1.调用父类的all, 获取所有数据
customers = super().all()
# 2. 返回的books是QuerySet集合,还可以继续使用所有查询
return customers
class CustomerManager(models.Manager):
# 改变查询的结果集
def get_queryset(self):
return super(CustomerManager, self).get_queryset().filter(is_default_wx=False)
class Customer(models.Model, CustomerMixin):
user = models.OneToOneField(BaseUser, on_delete=models.PROTECT, related_name="customer", null=True)
is_default_wx = models.BooleanField(verbose_name="微信默认用户", default=True)
class Meta:
ordering = ["-id", ]
db_table = "customer"
verbose_name = "客户"
# def __str__(self):
# return self.company_name
all_objects = AllCustomerManager() # 自定义一个客户的管理类对象
objects = CustomerManager() # 自定义一个客户的管理类对象
以上就是如何进行admin的save_model 改写,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。