我的pre_save信号未应用我的字符串生成器

时间:2019-01-02 11:34:35

标签: django

我为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)

1 个答案:

答案 0 :(得分:0)

我注意到您正在将instance传递给order_id_generator,但在那里没有使用它。您可以避免使用信号,而可以将函数用作模型字段default

class Order(models.Model):
    order_id = models.CharField(max_length=120, default=order_id_generator)

并且您的函数中不需要参数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