Как присвоить значение полю модели, которое является конкатенацией двух других полей модели?

Я разрабатываю систему бронирования в рамках своего портфолио. Она позволяет пользователю (компании) бронировать временные интервалы для поставок, которые будут осуществляться в распределительный центр (РЦ) в определенную дату и время.

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 уже содержит информацию о времени.

Вернуться на верх