Django models.DateTimeField, как хранить значение без секунд?

У меня есть эта модель

class Appointments(models.Model):

    options = (
        ('waiting', 'In Attesa'),
        ('confirmed', 'Confermato'),
        ('closed', 'Chiuso'),
    )

    duration = (
        ('15', '15 minuti'),
        ('20', '20 minuti'),
        ('30', '30 minuti'),
        ('40', '40 minuti'),
    )

    date = models.DateTimeField(default=timezone.now)
    patient_first_name = models.CharField(max_length=250)
    patient_last_name = models.CharField(max_length=250)
    patient_email = models.EmailField(_('email address'))
    patient_phone = models.CharField(max_length=250)
    doctor = models.ForeignKey(Doctor, on_delete=models.PROTECT)
    room = models.ForeignKey(Room, on_delete=models.PROTECT, default=1)
    status = models.CharField(max_length=10, choices=options, default='waiting')
    message = models.TextField(null=True, blank=True) 
    notes = models.TextField(null=True, blank=True)
    appointment_date = models.DateTimeField(null=True, blank=True)
    duration = models.CharField(max_length=10, choices=duration, default='15')

    class Meta:
        ordering = ('-date', )
        unique_together = ('appointment_date', 'room', )

Как я могу хранить в БД значение appointment_date без секунд? Сейчас значение выглядит так 2021-11-05 17:30:43. Я бы хотел хранить его как 2021-11-05 17:30

Это потому, что иначе unique_together практически бесполезен для того, что мне нужно.

Я написал статью о построении вариантов DateTimeField, которые будут усекаться до недели, месяца, минуты и т.д.

В этом случае мы можем сделать MinuteDateTimeField с:

# app_name/fields.py

from datetime import timedelta
from django.db.models import DateTimeField

class DateTruncMixin:

    def truncate_date(self, dt):
        return dt

    def to_python(self, value):
        value = super().to_python(value)
        if value is not None:
            return self.truncate_date(value)
        return value

class MinuteDateTimeField(DateTruncMixin, DateTimeField):
    
    def truncate_date(self, dt):
        return dt.replace(second=0, microsecond=0)

Тогда вы можете использовать это MinuteDateTimeField с:

# app_name/models.py

from app_name.fields import MinuteDateTimeField

class Appointments(models.Model):
    # ⋮
    appointment_date = MinuteDateTimeField(null=True, blank=True)
Вернуться на верх