Вы можете использовать уникальное ограничение для предотвращения одновременной активности двух столбцов, но вам придется использовать True и None в качестве возможных значений, а не True и False.Это связано с тем, что уникальное ограничение будет разрешать только одно значение True в столбце, но также будет разрешать только одно значение False.Ни одно (или SQL NULL) значения не участвуют в ограничении уникальности, и поэтому вы можете иметь столько же тезисов, сколько и оставшихся строк.Чтобы обеспечить целостность базы данных, это, вероятно, лучше всего достигается с типом данных enum только с одним возможным значением.
import enum
class Active(enum.Enum):
true = True
class Credentials(db.Model):
active = db.Column(db.Enum(Active), unique=True)
Теперь вы можете использовать Active.true в качестве значения для указания активных учетных данных и None для всех остальныхучетные данные с обеспечением целостности на уровне базы данных.Если вы намеревались иметь одну активную учетную запись на пользователя, а не одну активную учетную запись в целом, этого можно достичь с помощью отдельного оператора UniqueConstraint.
class Credential(db.Model):
__tablename__ = "credentials"
__table_args__ = (db.UniqueConstraint('user_id', 'active'),)
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
user = db.relationship("User", back_populates="credentials")
active = db.Column(db.Enum(Active))
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
credentials = db.relationship("Credential", back_populates="user")
Хотя это предотвращает пометку нескольких активных учетных данных как активных, оно будетне запрещайте пользователю не иметь активных учетных данных, и вам придется полагаться на логику вашего приложения для этого.