Джанго, уникальное поле поколения - PullRequest
2 голосов
/ 13 февраля 2010

У меня есть модель промо-акции, которая содержит коды промо-акций и иностранный ключ для модели покупки.

Вот модель:

class Promotion(models.Model):
 purchase =  models.ForeignKey('Purchase')
 promotion_code = models.CharField(max_length=20)
 def promotion_code_generate(self): #returns a string based promotion code with 7 length
  from django.conf import settings
  import random, string
  return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(7))
 class Meta:
  unique_together = (("purchase", "promotion_code"),)

Теперь я хочу, чтобы мое поле promo_code было уникальным для каждой покупки, и для этого я добавил unique_together = (("purchase", "promotion_code"),) в мету класса. Он отлично работает при вводе новой записи через панель администратора, так как поля с промо-кодами пусты, и я должен ввести их вручную.

Однако я хочу сделать это уникальным, чтобы при совершении покупки система брала этот экземпляр модели Purcase и автоматически генерировала этот экземпляр класса Акции, связанный через поле покупки модели Акции.

Для этого мне нужны две вещи:

1 - мне нужно, чтобы мой метод promo_code_generate проверял более ранние экземпляры модели Акции, и если сгенерированный в данный момент код не существует в прошлом для сделки, возвращая его, если не регенерируя один раз, повторная попытка до несуществующего продвижения найдена кодовая строка для этой покупки.

2 - Я попытался назначить стандартное значение_произведения_для_перемещения в поле код_процесса, однако не удалось:

promotion_code = models.CharField(max_length=20,default=self.promotion_code_generate())

Как это можно решить?

1 Ответ

3 голосов
/ 13 февраля 2010
import random

@property
def promotion_code_generate(self):
    while 1:
        prom_code = str(random.random())[2:]
        try:
            Promotion.objects.get(promotion_code=prom_code)
        except:
            return prom_code

Определив его как @property, вы можете назначить его параметру default.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...