Членство в Django (выбор 30, 90, 180 дней) и его логика - PullRequest
0 голосов
/ 24 мая 2019

Есть 3 варианта членства, 1 3 и 6 месяцев. Я написал за 1 месяц, но проблема в том, чтобы написать логику, которая зависит от выбора.

Хорошо работает с 1 месяца, но:

members_choices = (

            ('1', '1 month'),
            ('3', '3 months'),
            ('6', 'half an year'),

)

Членство в классе (models.Model):

client = models.ForeignKey(Client, on_delete=models.CASCADE)
types = models.CharField(max_length=1, choices=membership_choices)
end = models.DateTimeField(default=datetime.today()+timedelta(days=30))

Проблема в том, чтобы написать в этой модели что-то вроде этого:

если типы == 3:

  datetime.today() + timedelta(days=90)

типы elif == 6:

  datetime.today() + timedelta(days=180)

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Есть много разных способов справиться с этим.Я думаю, что лучшим подходом было бы создание метода для определения конца внутри модели, поскольку он, скорее всего, понадобится и для обновления:

class Membership(models.Models):
    # your fields here

    def set_expiration(self):
        days = {
            # you can normalize this to use from your choices, just an example
            '1': 30,
            '3': 90,
            '6': 180
        }
        self.end = timezone.localdate() + timedelta(days=days.pop(self.type))
        self.save()

Итак, с вашей точки зрения, для создания членства,Вы просто звоните своему instance.set_expiration() после того, как создаете или продлеваете его

0 голосов
/ 24 мая 2019

Во-первых, вы можете установить ваше поле end как значение по умолчанию.
И вы можете переопределить метод save(), чтобы гарантировать, что он будет заполнен на основе поля types.

def save(self, *args, **kwargs):
    if not self.end:
        self.end = datetime.today() + timedelta(days=self.types * 30)
    super().save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...