LINUX.ORG.RU

django, postgresql, считать значение во время insert

 , ,


0

1

Есть django с postgresql.

Есть модель:

class Bryak(models.Model):
    year = models.PositiveSmallIntegerField()
    number = models.PositiveSmallIntegerField()

    class Meta:
        unique_together = (
            ('year', 'number',),
        )

Каждый год номер должен начинаться с единицы, т. е

2015, 1
2015, 2
2015, 3
...
2016, 1
2016, 2
2016, 3
...
2017, 1

При добавлении новой инстанции модели должен браться текущий год и автоматически подсчитываться номер.

Как это сделать красиво?



Последнее исправление: suuaq (всего исправлений: 1)

Переопределить метод save у модели.

Но больше похоже, что можно просто нормально схему дб спланировать, либо посмотреть что можно сделать с местным ORM. Все это выглядит как 5 нога у собаки: какие левые индексы для сортировки. Их в этом порядке можно расставить по времени добавления (отдельное поле), например, и при желании пронумеровать.

инстанции

ты в курсе, что это значит? https://ru.wikipedia.org/wiki/Инстанция

BigAlex ★★★
()

Средствами диджанго вложенный запрос не сделаешь. Можно raw запросом но это не красиво

Остается 2 последовательных, получение max mumber, и вставка увеличенного значения

ism ★★★
()
Ответ на: комментарий от BigAlex

Instance, умник. Но вообще переводить криво конечно не надо.

anonymous
()
Ответ на: комментарий от BigAlex

Но больше похоже, что можно просто нормально схему дб спланировать, либо посмотреть что можно сделать с местным ORM. Все это выглядит как 5 нога у собаки: какие левые индексы для сортировки. Их в этом порядке можно расставить по времени добавления (отдельное поле), например, и при желании пронумеровать.

Я таки ничего не понял. Мне у любого отдельно взятого объекта нужны год и номер. Только в целях визуализации. Каким способом их можно «при желании» пронумеровать?

ты в курсе, что это значит?

Не знал, да. Спасибо. В интернетах пишут «экземпляр объекта», это нормально? Или всё-таки «экземпляр класса»?

suuaq
() автор топика
Ответ на: комментарий от ism

Остается 2 последовательных, получение max mumber, и вставка увеличенного значения

А если коллизия?

suuaq
() автор топика
Ответ на: комментарий от suuaq

Делаешь обработку exception

Или сделать number автоинкремент, если все равно на значение

ism ★★★
()
Ответ на: комментарий от suuaq

Мне у любого отдельно взятого объекта нужны год и номер. Только в целях визуализации. Каким способом их можно «при желании» пронумеровать?

Номер только для сортировки используется? Или также отображается где-то?

В принципе, для сортировки достаточно id использовать, все-равно он уже существует. А если где-то порядковый номер выводишь - то можно уже там его формировать.

gruy ★★★★★
()
Ответ на: комментарий от suuaq

Только в целях визуализации. Каким способом их можно «при желании» пронумеровать

Добавляешь поле created_at, который DateTimeField(auto_now_add=True) в Meta делаешь order_by по этому полю. Далее я не очень понимаю зачем тебе еще эти цифры, потому что при запросе элементы и так будут в нужном тебе порядке: ты можешь обращаться к элементам из QuerySet по их номеру, и потом ты же все равно обходишь его в цикле - считай итерации, например.

Но, если тебе хочется чего-то значительно более сильного, то перегони QuerySet в Pandas (либо напрямую, либо через обертку django-pandas). Сам так делаю, когда вдруг не достаточно ни возможностей ORM, ни питоновских примитивов для работы с данными.

В интернетах пишут «экземпляр объекта», это нормально?

В данном случае, конечно, лучше по-русски «экземпляр», либо «инстанс» - люди поймут. Просто инстанция впринципе тоже правильно, но режет слух так же как секс называть коитусом.

BigAlex ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.