Django Auto Increment Field Non Pk
Как сделать модель так, чтобы каждый заказ, который отправляет клиент, автоматически увеличивался (т.е. номер_заказа), не связываясь с первичным_ключом obj заказа?
Models.py
class Costumer(models.Model):
costumer_name = models.CharField(max_length=100)
costumerID = models.CharField(max_length=100)
class Order(models.Model):
costumer = models.ForeignKey(Costumer, related_name='order', on_delete=models.CASCADE)
order_name = models.CharField(max_length=100)
order_number = models.IntegerField(default=0)
Пример JSON
[
{
"id": 1,
"order": [
{
"id": 1,
"order_name": "fruit",
"order_number": 1,
"costumer": 1
},
{
"id": 2,
"order_name": "chair",
"order_number": 2,
"costumer": 1
},
{
"id": 3,
"order_name": "pc",
"order_number": 3,
"costumer": 1
}
],
"costumer_name": "john doe",
"costumerID": "81498"
},
{
"id": 2,
"order": [
{
"id": 4,
"order_name": "phone",
"order_number": 1,
"costumer": 2
},
{
"id": 5,
"order_name": "car",
"order_number": 2,
"costumer": 2
}
],
"costumer_name": "jane doe",
"costumerID": "81499"
}
]
Если мне нужно предоставить больше файлов, таких как seriallizers.py и т.д., пожалуйста, дайте мне знать. Спасибо заранее.
Вы можете использовать AutoField. Документация django говорит об этом здесь: https://docs.djangoproject.com/en/3.2/ref/models/fields/#autofield
Я думаю, что может сработать использование IntegerField
(практически то же самое, что использует AutoField
под капотом), и инкрементирование при первом сохранении модели (до того, как она будет помещена в базу данных).
пример:
from django.db import models
class MyModel(models.Model):
# This is what you would increment on save
# Default this to one as a starting point
display_id = models.IntegerField(default=1)
# Rest of your model data
def save(self, *args, **kwargs):
# This means that the model isn't saved to the database yet
if self._state.adding:
# Get the maximum display_id value from the database
last_id = self.objects.all().aggregate(largest=models.Max('display_id'))['largest']
# aggregate can return None! Check it first.
# If it isn't none, just use the last ID specified (which should be the greatest) and add one to it
if last_id is not None:
self.display_id = last_id + 1
super(MyModel, self).save(*args, **kwargs)
Вы можете переопределить функцию сохранения при создании заказа и установить номер заказа в этот момент на основе максимального из других заказов клиента
class Order(models.Model):
costumer = models.ForeignKey(Costumer, related_name='order', on_delete=models.CASCADE)
order_name = models.CharField(max_length=100)
order_number = models.IntegerField(default=0)
def save(self, *args, **kwargs):
if not self.pk:
# get all your customers orders and get the last order number
last_order = self.customer.order.all().order_by('order_number').last()
self.order_number = last_order.order_number + 1
super(Order, self).save(*args, **kwargs)