1

Тема: Допомога в створення поля в таблиці

from django.db import models

class Periods(models.Model):
    name_period = models.CharField(
        max_length=100,
        unique=True,
        verbose_name='Назва періоду'
    )

    class Meta:
        ordering = ['id']
        verbose_name = 'Період'
        verbose_name_plural = 'Періоди'

    def __str__(self):
        return self.name_period


class Events(models.Model):
    name_period = models.ForeignKey(Periods,
                                    on_delete=models.SET_NULL,
                                    null=True,
                                    verbose_name='Період'
                                    )
    place_id = models.FloatField(unique=True, verbose_name='Порядок події')
    year = models.CharField(
        max_length=100,
        verbose_name='Рік події'
    )
    event = models.CharField(
        max_length=100,
        verbose_name='Назва події'
    )
    description_event = models.TextField(
        verbose_name='Опис події'
    )
    maps = models.ImageField(
        upload_to='',
        verbose_name='Карти події'
    )

    class Meta:
        ordering = ['place_id']
        verbose_name = 'Подія'
        verbose_name_plural = 'Подій'

    def __str__(self):
        return self.name_period

Я хочу створити поле(таблиця Events), яке буде заповнюватись автоматично(дійсними числами(1.0, 2.0, ...)) із можливістю вставки записів між вже існуючими  записами та сортуванням по цьому полі.

2

Re: Допомога в створення поля в таблиці

GPT-4 написав:

Для вирішення цієї проблеми, вам потрібно додати default і auto_now_add аргументи для поля place_id. default аргумент використовується для встановлення значення за замовчуванням, а auto_now_add дозволяє автоматично присвоювати значення поля при створенні нового запису. Оскільки вам потрібно використовувати послідовні дійсні числа, ви можете створити функцію, яка буде генерувати наступне доступне число для нового запису.

Ось змінений клас Events:

from django.db import models

def get_next_place_id():
    max_place_id = Events.objects.aggregate(models.Max('place_id'))['place_id__max']
    return max_place_id + 1.0 if max_place_id else 1.0

class Periods(models.Model):
    ...  # Оригінальний код класу Periods без змін

class Events(models.Model):
    name_period = models.ForeignKey(Periods,
                                    on_delete=models.SET_NULL,
                                    null=True,
                                    verbose_name='Період'
                                    )
    place_id = models.FloatField(default=get_next_place_id, unique=True, verbose_name='Порядок події')
    year = models.CharField(
        max_length=100,
        verbose_name='Рік події'
    )
    event = models.CharField(
        max_length=100,
        verbose_name='Назва події'
    )
    description_event = models.TextField(
        verbose_name='Опис події'
    )
    maps = models.ImageField(
        upload_to='',
        verbose_name='Карти події'
    )

    class Meta:
        ordering = ['place_id']
        verbose_name = 'Подія'
        verbose_name_plural = 'Подій'

    def __str__(self):
        return self.name_period

Тепер кожен новий запис у таблиці Events буде автоматично отримувати наступне доступне значення для поля place_id. Якщо вам потрібно вставити запис між існуючими записами, ви можете просто встановити значення place_id рівним середньому значенню між двома сусідніми записами.