как люди обычно имеют дело с переменными класса в django? - PullRequest
2 голосов
/ 06 февраля 2010

Я не вижу каких-либо положений об этом в django docs, так как же люди поступают так?

Мой конкретный случай таков.

У меня есть корзина покупок, каждый экземпляр корзины имеет поле номера счета, однако номер счета генерируется только в том случае, если корзина переходит в оплаченный статус, поэтому не все экземпляры корзины покупок будут иметь номер счета. Я хочу, чтобы все номера счетов-фактур были последовательными без пропусков между ними, поэтому значение pk по умолчанию в этом случае не идеально, поэтому я хочу, чтобы переменная класса действовала как счетчик для номеров счетов-фактур и была доступна для всех экземпляров.

Ответы [ 3 ]

1 голос
/ 06 февраля 2010

Первичный ключ по умолчанию уже будет уникальным монотонным целым числом (даже в SQLite, если вы не удаляете какие-либо записи), так что вы можете просто использовать его для него.

0 голосов
/ 06 февраля 2010

В вашей модели есть поле для счета:

class Cart(models.Model):
 .....
 invoice_id = models.PositiveIntegerField(null=True,unique=True)

Устанавливайте значение только тогда, когда это необходимо.

Чтобы найти следующий идентификатор:

try:
  nextID = Cart.objects.exclude(invoice_id=None).order_by('-invoice_id')[0].invoice_id + 1
except IndexError:
  nextID = 1

Подумав об этом еще немного ... мне приходит в голову, что счета-фактуры лучше использовать в качестве отдельной модели. Вы можете связать их с вашими тележками с помощью ForeignKey("invoice",null=True). Затем они могут быть созданы при необходимости, поле первичного ключа по умолчанию может быть вашим монотонно увеличивающимся числом, а затем может иметь отдельный жизненный цикл для объектов корзины.

0 голосов
/ 06 февраля 2010

Вы можете создать поле в модели и указать его в качестве первичного ключа или использовать текущий текущий первичный ключ, если вы переносите устаревшую базу данных primary_key = True .

Django ORM не поддерживает сложные ключи. Он не позволяет использовать таблицу без первичного ключа.

Если вам нужна специальная логика для генерации номера вашего счета (например, № клиента + '-' + номер года), вы можете создать поле для этого ключа, но это не будет первичный ключ. Вызовите эту функцию генерации ключа при сохранении объекта в функции Model.save, если этот ключ еще не указан для текущего объекта.

...