Создать номер автоинкремента для каждого пользователя при оформлении заказа - PullRequest
1 голос
/ 16 апреля 2020

Это наиболее часто задаваемый вопрос, но я не могу выполнить sh эту задачу. У меня есть модель Book с полем book_history, например

class Book(Models):
   customer = models.ForeignKey(Customer)
   book_history_number = models.CharField(max_length=120)

       def _get_book_customer_id(self):
        b_id = self.customer
        num = 1
        while Book.objects.filter(customer=b_id).exists():
            num += 1
        return cus_ord_id

       def save(self, *args, **kwargs):
          if not self.book_history_number:
            self.book_history_number = self._get_book_customer_id()

. Моя цель состоит в том, чтобы увеличить, когда пользователь что-то заказывает, например, у меня есть пользователи A и B, а забронированные данные и book_history_number должны быть равны 1 в следующий раз это должно быть 2, как это: A: 1, 2, ... n, потому что A забронировал два раза B: 0 B не забронировал, но если бы пользователь B сделал это, это было бы 1.

с кодом выше I не может решить эту проблему. Любая помощь, пожалуйста

1 Ответ

0 голосов
/ 16 апреля 2020

Если вы хотите присвоить номер, лучше сделать это IntegerField. Кроме того, вы можете рассчитать Max количество существующих книг для этого номера плюс один:

from django.db.models import Max

class Book(Models):
   customer = models.ForeignKey(Customer)
   book_history_number = models.IntegerField(default=0)

   def _get_book_customer_id(self):
       return Book.objects.filter(customer_id=self.customer_id).aggregate(
           <b>numb=Max('book_history_number')+1</b>
       )['numb'] or 0

   def save(self, *args, **kwargs):
       if not self.book_history_number:
           self.book_history_number = self._get_book_customer_id()
       super().save(*args, **kwargs)

Возможно, стоит обернуть представления, которые используют это в транзакции atomi c, чтобы не назначать одно и то же номер из-за условий гонки.

...