Решение 1
Один простой выход - перебирать год / месяц с применением фильтров:
years = {sheet.year for sheet in Balance_Sheet.objects.all()}
for year in years:
year_months = {sheet.month for sheet in Balance_Sheet.objects.filter(year=year)}
for month in year_months:
object_to_update = Balance_Sheet.objects.filter(
year=year,
period=month
).order_by('-publish_date').first()
object_to_update.status = 1
object_to_update.save()
Для этого могут быть более сложные ORM-функции. в один запрос, но код, который я там написал (не тестировался), будет работать в большинстве / во всех Django версиях. Кроме того, количество запросов к базе данных не будет большим, поскольку мы говорим о суммах за год / месяц.
Решение 2
В базе данных postgres вы можно попробовать следующее:
Balance_Sheet.objects.all().order_by(
'year', 'period', '-publish_date'
).distinct(
'year', 'period'
).update(
status=1
)
Обратите внимание, что это не будет работать в других базах данных, таких как MySQL. См. Документацию django здесь .