Django ORM: с использованием комбинации F, MAX и GROUP BY - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть собственный менеджер моделей, который переопределяет метод create.Целевая модель имеет поле order_nbr, которое представляет порядок элемента.Я хочу увеличить значение MAX order_nbr на единицу.Ключевым моментом здесь является то, что значение MAX должно приниматься в сочетании с GROUP BY.Пожалуйста, посмотрите на мой код (который все еще может зависеть от состояния гонки):

class ContentOnPageModelManager(models.Manager):

    def create(self, **kwargs):
        if 'order_nbr' not in kwargs:
            try:
                order_nbr = ContentOnPage.objects.filter(page=kwargs['page']).latest('order_nbr').values('order_nbr')[0]
            except ContentOnPage.DoesNotExist:
                order_nbr = 0
            # TODO (dmitry): race condition
            kwargs['order_nbr'] = order_nbr + 1
        return super().create(**kwargs)



class ContentOnPage(models.Model):

    page = models.ForeignKey('Page', on_delete=models.CASCADE)
    video = models.ForeignKey('Video', null=True, on_delete=models.SET_NULL)
    audio = models.ForeignKey('Audio', null=True, on_delete=models.SET_NULL)
    text = models.ForeignKey('Text', null=True, on_delete=models.SET_NULL)
    order_nbr = models.PositiveIntegerField(default=0)

Как я могу заменить этот код на что-то вроде:

kwargs['order_nbr'] = F(GROUP_BY('page').MAX('order_nbr')) + 1

^^^это больше похоже на псевдокод, хотя

...