Django генерирует пользовательский номер чека

Я новичок в django, я хочу создать пользовательский номер Cart, который начинается с #. Когда новая запись поступает в базу данных. #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?

Создайте функцию, которая находит следующий номер_тележки:

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=True и null=True.

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 и сделайте значение defalut 1000, чтобы начать с него

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

после этого, когда вы захотите вывести это значение, добавьте к нему '#' из фронтенда, что будет лучше, быстрее и проще

Вернуться на верх