Сравните выражение с константой в ограничении 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, а также сравнивать эти выражения с другими выражениями или константами, используя отношение равенства или неравенства (например, =
или <=
).