конкурса может быть один из статусов. Как правильно сделать, чтобы в базе мог быть только один конкурс с уникальным тайтлом, для определенного статуса ? Пример: есть конкурс с названием Test, и статусом Open. Тогда другие пользователи не могут создать конкурс с таким же именем, но если этот конкурс поменяет статус в Finished, то этот тайтл станет открытым. Тоесть проверять уникальность только среди тайтлов с определенным статусом ?
Делаю через UniqueConstraint, но что-то не совсем то получается
https://dpaste.org/9eJt
а чем не подходит unique_together('title', 'status')?
В таком случае ограничением будет уникальный статус для каждого из статусов, верно ? А необходимо, чтобы была возможность сделать сколько угодно тайтлов со статусом Draft например, но только один для статуса Open. К тому же, а доке пишут, что unique_together уже устаревшее решение, и стоит использовать constraints
unique_together - это и есть constraint :))) но поставленную задачу не решает, неправильно понял, сорри
https://stackoverflow.com/questions/62170840/conditional-unique-together-in-django мне кажется, ты был на верном пути
В доке это два отдельных раздела:)
сорри, не совсем понял - каких?
models.UniqueConstraint( fields=['crop', 'order'], condition=Q(sku=None), name='unique_2' ) конкретно вот этот пример похож на то, что нужно
По функционалу да, это оно и тоже, согласен. Но в доке - это разные носки, у со временем, я так понимаю, unique_together будет не лучшей практикой) https://docs.djangoproject.com/en/3.2/ref/models/options/#django.db.models.Options.unique_together https://docs.djangoproject.com/en/3.2/ref/models/options/#constraints
Да, это похоже на стандартный пример из доки, но он работает не совсем корректно. Сейчас попробую восстановить, и скажу, что там не так
как минимум, в перечне полей у тебя одно поле перечислено
UniqueConstraint(fields=['title'] ... ) где ж второе поле? :)
Так тоже пробовал)
ну вот так скорее всего правильнее у тебя там кастом поле стоит, фильтрация точно корректно отрабатывает? как именно не работает?
То условие, что у тебя сделает уникальным title когда status open, ты тут буквально разрешаешь создавать: title='tittle' + status='open' title='tittle1' + status='open' title='tittle2' + status='open' Но повторно, например title='tittle' + status='open' — уже не вийдет
Так все работает действительно, только одна ошибка остается. Когда есть тайтл со статусом Open, и другой юзер пытается свой тайтл опубликовать из статуса Draft, появляется ошибка IntegrityError, что логично. Но, когда первый пользователь свой тайтл перевел в другой статус, или удалил, не важно, то при попытке вторым пользователем уже опубликовать свой тайтл, на место первого, ошибка IntegrityError остается. Я так понимаю, потому что запиь в бд уже есть ?
Обсуждают сегодня