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)
после этого, когда вы захотите вывести это значение, добавьте к нему '#' из фронтенда, что будет лучше, быстрее и проще