django - 我的 pre_save 信号没有应用我的字符串生成器
问题描述
我为我的 order_id 字段编写了一个简单的字符串生成器。我在 shell 中测试了生成器脚本,它运行良好。但是当我运行服务器并尝试在 django admin 中创建订单时,单击保存时订单 ID 字段仍为空。我究竟做错了什么?
from datetime import date
from django.db import models
from django.db.models.signals import pre_save
from cartapp.models import Cart
class Order(models.Model):
order_id = models.CharField(max_length=120)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
status = models.CharField(max_length=50, default='Waiting', null=True, blank=True)
order_total = models.DecimalField(default=0.0, max_digits=10, decimal_places=1)
date_created = models.DateTimeField(auto_now_add=True)
def order_id_generator(instance):
today = date.today().strftime("%Y-%m-%d")
last_order_raw = Order.objects.latest('order_id').date_created
last_order_date = str(last_order_raw).split(' ')[0]
if today != last_order_date:
new_order_id = str(today + " 1")
else:
last_order = Order.objects.latest('order_id')
extract = last_order.order_id.split(' ')[1]
increment = int(extract) + 1
new_order_id = today + " " + str(increment)
return new_order_id
def pre_save_order_id(sender, instance, *args, **kwargs):
if not instance.order_id:
instance.order_id = order_id_generator(instance)
pre_save.connect(pre_save_order_id, sender=Order)
解决方案
我注意到你正在传递instance
但order_id_generator
没有在那里使用它。您可以避免使用信号,并且可以将函数用作模型字段default
:
class Order(models.Model):
order_id = models.CharField(max_length=120, default=order_id_generator)
并且您的函数中不需要 arg instance
:
def order_id_generator():
today = date.today().strftime("%Y-%m-%d")
last_order_raw = Order.objects.latest('order_id').date_created
last_order_date = str(last_order_raw).split(' ')[0]
if today != last_order_date:
new_order_id = str(today + " 1")
else:
last_order = Order.objects.latest('order_id')
extract = last_order.order_id.split(' ')[1]
increment = int(extract) + 1
new_order_id = today + " " + str(increment)
return new_order_id
推荐阅读
- html - 如何使 div 内容不会过度扩展
- javascript - 如何路由嵌入了查询字符串的搜索 URL?
- python - 如何在 Python 中按组执行 proc rank(SAS 函数)?
- php - 在 PHP 中按键和求和值对多维数组进行分组
- c# - Xamarin 管理未处理的异常
- asp.net - 为什么 Base64 字符串在 Message Box 中显示为空?
- python - 获取 dict 每个项目并在一行中获取一个新列表
- magnolia - 将 Magnolia 从企业版迁移到社区版
- chef-infra - 如何强制 Chef 的 yum_repository 资源使用“makecache fast”?
- kubernetes - 如何使用外部 DNS 创建 SRV 记录?