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)

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