首页 > 解决方案 > 我的 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)

标签: django

解决方案


我注意到你正在传递instanceorder_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

推荐阅读