У меня есть этот шаблонный тег, который в конечном итоге возвращает список "активных" рекламных объявлений (проверяет, является ли Кампания с активным полем True
, затем извлекает объявления из Кампании с помощью набора запросов)
@register.assignment_tag
def get_current_campaigns(amount):
# Get all the campaigns that are active
current_campaigns = Campaign.objects.filter(active=True)
current_campaigns_count = current_campaigns.count()
# To avoid the list index being out of range and throwing an IndexError
# We reduce the amount to match the amount of rows in the model if the
# amount of rows is less than the amount being requested.
if amount > current_campaigns_count:
amount = current_campaigns_count
# Select active campaigns randomly
random_camps = []
for i in range(amount):
random_camps.append(random.choice(current_campaigns))
# prepare all the ads to return
output = []
for campaign in random_camps:
# get all the ads that a campaign has
ads = campaign.advertisement_set.all()
# now select one randomly
ad = random.choice(ads)
# hand it to output
output.append(ad)
# mark that this campaign has been seen
campaign.impressions = F('impressions') + 1
campaign.save()
# checks and sets if the campaign is still active
campaign.check_active()
return output
И вот модель, которая идет с ним:
class Campaign(models.Model):
''' Represents an Advertisement Campaign '''
title = models.CharField(max_length=50, blank=True, verbose_name='Campaign Title')
impressions = models.IntegerField()
impression_limit = models.IntegerField()
created = models.DateTimeField(auto_now_add=True)
active = models.BooleanField(default=False)
def check_active(self):
''' Checks if the Campaign is currently active '''
if self.impressions >= self.impression_limit:
self.active = False
self.save()
Странный момент: каждый раз, когда я захожу на страницу, на которой размещена реклама, а затем проверяю ее в админке, количество показов объекта увеличивается на 2 (должно быть 1) и помечается как False, даже если это if self.impressions >= self.impression_limit
неверно, он по-прежнему каким-то образом изменяет активное поле на False
независимо.
Есть какие-нибудь подсказки, почему происходит такое странное поведение? При необходимости я могу предоставить дополнительную информацию.
random_camps
? Возможно ли, что ваша кампания присутствует там более одного раза? - person kylieCatt   schedule 23.05.2015random_camps
, с полным кодом. - person ApathyBear   schedule 23.05.2015