Как в поле БД сохранить диапазон дат в формате datetime.date из двух полей models.DateField?

Есть модель:
class Reservation(models.Model):
   order_date = models.DateTimeField(auto_now_add=True, verbose_name='Создана')
   #...
   checkin = models.DateField(verbose_name='Дата заезда')
   checkout = models.DateField(verbose_name='Дата выезда')
   days = ???


Как сохранить в days список дней от checkin до checkout в формате datetime.date? И вообще, где это делается? Прямо в классе, или методом внутри класса? Или вообще отдельной функцией в отдельном приложении в параллельном мире?
  • Вопрос задан
  • 783 просмотра
Решения вопроса 1
Я у себя в приложении просто методом вычисляю разницу между временными отметками.
В вашем случае это будет примерно так:

def get_date_diff(self):
    return (self.checkout - self.checkin).days


Или, если нужен именно список с объектами datetime.date:

def get_date_diff(self):
    return [self.checkout + datetime.timedelta(i) for i in range((self.checkout - self.checkin).days)]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
если нужен список дней - сделайте подчиненную таблицу с перечнем дат, которые входят в промежуток. даты можно генерировать сигналом .

Если просто нужно посчитать сколько дней - используйте совет от Никита Конин

Если ничего не подходит - сформулируйте еще раз Ваш вопрос, т.к. из него не особо понятно чего же вам хочется в итоге получить
Ответ написан
Если у вас PostgreSQl и не старая джанга, то всё просто:
https://docs.djangoproject.com/es/1.9/ref/contrib/...

from django.contrib.postgres.fields import ArrayField
from django.db import models

class ArrayFieldTest(models.Model):
    days = ArrayField(base_field=models.DateField(), default=list)


>>> from test.models import ArrayFieldTest
>>> from django.utils import timezone
>>> from dateutil.relativedelta import relativedelta
>>> date_list = [timezone.now().date(), timezone.now().date() + relativedelta(days=1)]
>>> date_list
[datetime.date(2016, 1, 23), datetime.date(2016, 1, 24)]
>>> ArrayFieldTest(days=date_list).save()
>>> ArrayFieldTest.objects.all().first().days
[datetime.date(2016, 1, 23), datetime.date(2016, 1, 24)]
>>> ArrayFieldTest().save()
>>> ArrayFieldTest.objects.all().last().days
[]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы