Как присвоить значение полю модели, которое является конкатенацией двух других полей модели?
Я разрабатываю систему бронирования в рамках своего портфолио. Она позволяет пользователю (компании) бронировать временные интервалы для поставок, которые будут осуществляться в распределительный центр (РЦ) в определенную дату и время.
Models.py
from django.db import models
from django.utils import timezone
from django.urls import reverse
import datetime as dt
from django.contrib.auth.models import User
# Create your models here.
class Booking(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
qty_plts = models.PositiveSmallIntegerField(default=1)
cbm = models.PositiveSmallIntegerField(default=1)
created_date = models.DateTimeField(default=timezone.now())
delivery_date = models.DateTimeField()
delivery_time = models.TimeField()
booking_number = models.CharField(max_length=50)
def __str__(self):
self.booking_number = # How to concatenate delivery_date and delivery_time?
return self.booking_number
def get_absolute_url(self):
return reverse("booking_detail",kwargs={'pk':self.pk})
forms.py
from django import forms
from bookmyslot.models import Booking
from bootstrap_datepicker_plus import DatePickerInput
import datetime as dt
HOUR_CHOICES = [(dt.time(hour=x), '{:02d}:00'.format(x)) for x in range(7, 13)]
class BookingForm(forms.ModelForm):
class Meta:
model = Booking
fields = ('qty_plts','cbm','booking_date','booking_time')
widgets = {'delivery_date':DatePickerInput(options={"daysOfWeekDisabled":[0,6]}),
'delivery_time':forms.Select(choices=HOUR_CHOICES)}
Я хотел бы присвоить полю booking_number значение, которое является конкатенацией полей delivery_date и delivery_time.
Итак, если клиент смог успешно забронировать слот на запрошенную дату и время доставки, генерируется уникальный номер бронирования, как указано выше.
Как я могу это сделать? Если возможно, я бы хотел, чтобы формат был "ДДМММГГГГГГХХММ" или "ДД-ММ-ГГГГ-ХХ-ММ"
Так, если клиент бронирует дату доставки 6 октября и время доставки 07:00, присвоенный номер бронирования должен быть "061020210700".
Спасибо!
Вы можете переопределить метод save
модели и использовать стандартное форматирование строк:
class Booking(models.Model):
# ...
def save(self, **kwargs):
if not self.booking_number:
self.booking_number = f"{self.delivery_date:%Y%m%d}{self.delivery_time:%H%M}"
super().save(**kwargs)
В качестве примечания, использование DatetimeField
для delivery_date
делает дополнительное поле времени излишним, поскольку поле datetime уже содержит информацию о времени.