【问题标题】:Django generate custom cheque numberDjango 生成自定义支票号码
【发布时间】:2022-10-07 14:24:36
【问题描述】:

我是 django 的新手,我想创建以 # 开头的自定义购物车编号。当新记录进入数据库时​​。 #1-1000, #1-1001, #1-9999, .... #2-1000, ...#2-9999 等

This is my model
class Cart(models.Model):
    # id = models.CharField(primary_key=True, editable=False, max_length=10)
    user = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name=\"cart\")
    create_date = models.DateField(auto_now_add=True)
    cart_number = models.CharField(max_length=500, default=increment_cart_number, null=True, blank=True)
    total_summa = models.FloatField()
    time = models.TimeField(auto_now_add=True)

cart_number 将始终在 1000- 9999 范围内,那么如何使用 increment_cart_number 函数来做到这一点?

标签: django django-models django-rest-framework


【解决方案1】:

创建一个函数,查找下一个购物车编号:

class Cart(models.Model):
    ...
    def get_next_cart_number(self):
        number = list(map(int, Cart.objects.last().cart_number.replace("#", "").split("-")))
        if number[1] == 9999:
            number[0] += 1
            number[1] = 1000
        return f"#{number[0]}-{number[1]}"

然后添加信号,因此它将在创建时设置。在应用程序中创建文件 signals.py:

from my_app.models import Cart
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Cart)
def create_user_profile(sender, instance, created, **kwargs):
    if created and not instance.cart_number:
        instance.cart_number = instance.get_next_cart_number()
        instance.save()

并在同一个应用程序中的 apps.py 中导入信号文件:

class MyAppConfig(AppConfig):
    ...
    def ready(self):
        from . import signals

这样每次你都会创建Cart对象,在他第一次保存之后(created变量告诉它)它会找到并设置一个新的购物车号码。请记住,保留blank=Truenull=True 属性很重要。

【讨论】:

  • 这个错误'NoneType' object has no attribute 'replace'
【解决方案2】:
def increment_cart_number():
    last_cart_number = Cart.objects.last()
    if last_cart_number.cart_number == None:
      return '#1000'
    else:
        last_cart_number.cart_number = last_cart_number.cart_number.replace('#', '')
        last_cart_number.cart_number += 1
        last_cart_number.cart_number = '#' + last_cart_number.cart_number
        return last_cart_number.cart_number

但我建议您以更清洁的方式和最佳实践以另一种方式做到这一点:

将此字段设为AutoField 并将默认值设为 1000 以从它开始

cart_number = models.AutoField(auto_created = True, default=1000)

之后,当您要打印此值时,请从前端添加“#”,这将更好、更快、更容易

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2022-11-16
    • 2021-07-13
    相关资源
    最近更新 更多