Сравните выражение с константой в ограничении CHECK

Я хотел бы использовать CheckConstraint Django для добавления check ограничений к таблице с помощью функции num_nonnulls() PostgreSQL, подобно этому:

create table foo(
    a text,
    b int,
    [...],
    check num_nonnulls(a, b, ...) = n);

n является константой, но может быть разной для разных таблиц (в основном это будет 1, но я хотел бы найти общее решение). Вот как далеко я продвинулся:

class Foo(models.Model):
    a = models.TextField(null=True)
    b = models.IntegerField(null=True)
    [...]

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=models.ExpressionWrapper(
                    models.Func('a', 'b', function='num_nonnulls'),
                    models.BooleanField()),
                name='num_nonnulls_check')]

Это, конечно, упускает этап, на котором результат num_nonnulls() сравнивается с некоторым постоянным целым числом. Я попробовал определить функцию для этого:

def equals(a, b):
    return models.Func(a, b, template='%(expressions[0])s = %(expressions[1])s')

Но это не работает, потому что аргумент шаблона expressions является (я думаю) строкой (а %-шаблонные строки не имеют такого синтаксиса для извлечения частей аргумента, я думаю).

Куда мне двигаться дальше?

Я хотел бы найти решение, которое позволит мне использовать произвольные выражения, поддерживаемые Django ORM, а также сравнивать эти выражения с другими выражениями или константами, используя отношение равенства или неравенства (например, = или <=).

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