Django UniqueConstraint с выражениями не работает

Я пытаюсь и не могу создать UniqueConstraint для модели, объединяющей выражение TruncDate для поля datetime и пары других полей, следуя подходу, описанному здесь:

https://docs.djangoproject.com/en/4.1/ref/models/constraints/#expressions

Идея заключается в том, что каждый пользователь может создать только одну точку в день для Определения

Это будет работать, если я просто использую выражение TruncDate, или если я не использую выражение и создаю ограничение, используя поля = ("bucket", "user", "definition"), но не работает, если я пытаюсь объединить выражение с другими полями. База данных - Postgresql. Может ли кто-нибудь пролить свет?

models.py

class Point(models.Model):

    definition = models.ForeignKey(Definition, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    bucket = models.DateTimeField(default=timezone.now)
    value = models.DecimalField(decimal_places=5, max_digits=10)

    class Meta:
        ordering = ["-bucket", "definition"]
        constraints = [
            UniqueConstraint(
                TruncDate("bucket"),
                "user",
                "definition",
                name="max_daily_frequency",
            )
        ]

test.py

class TestPoint(TestCase)

   def test_make_point(self)

       u = User.objects.create()
       d = Definition.objects.create()

       p = Point.objects.create(user=u, definition=d, value=Decimal(1))

       assert p.pk

При неудаче происходит следующее:

/usr/local/lib/python3.10/site-packages/factory/base.py:40: in __call__
    return cls.create(**kwargs)
/usr/local/lib/python3.10/site-packages/factory/base.py:528: in create
    return cls._generate(enums.CREATE_STRATEGY, kwargs)
/usr/local/lib/python3.10/site-packages/factory/django.py:117: in _generate
    return super()._generate(strategy, params)
/usr/local/lib/python3.10/site-packages/factory/base.py:465: in _generate
    return step.build()
/usr/local/lib/python3.10/site-packages/factory/builder.py:262: in build
    instance = self.factory_meta.instantiate(
/usr/local/lib/python3.10/site-packages/factory/base.py:317: in instantiate
    return self.factory._create(model, *args, **kwargs)
/usr/local/lib/python3.10/site-packages/factory/django.py:166: in _create
    return manager.create(*args, **kwargs)
/usr/local/lib/python3.10/site-packages/django/db/models/manager.py:85: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
/usr/local/lib/python3.10/site-packages/django/db/models/query.py:671: in create
    obj.save(force_insert=True, using=self.db)
db/models.py:214: in save
    self.full_clean()
/usr/local/lib/python3.10/site-packages/django/db/models/base.py:1491: in full_clean
    self.validate_constraints(exclude=exclude)
/usr/local/lib/python3.10/site-packages/django/db/models/base.py:1442: in validate_constraints
    constraint.validate(model_class, self, exclude=exclude, using=using)
/usr/local/lib/python3.10/site-packages/django/db/models/constraints.py:335: in validate
    expressions = [
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

.0 = <tuple_iterator object at 0x7f8fb78e1f60>

    expressions = [
>       Exact(expr, expr.replace_references(replacement_map))
        for expr in self.expressions
    ]
E   AttributeError: 'F' object has no attribute 'replace_references'

/usr/local/lib/python3.10/site-packages/django/db/models/constraints.py:336: AttributeError
Вернуться на верх