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