这可能是完全愚蠢的事情,但我有这样一个要求,在我的模型中,至少有一个category
或parent_category
是not null
我的模型看起来像
class BudgetCategories(db.Model):
__tablename__ = 'budget_categories'
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
budget_id = Column(GUID(), ForeignKey('budgets.uuid'), nullable=False)
budget = relationship('Budget', backref='budgetCategories')
category = Column('category', sa.types.String, nullable=True)
parent_category = Column('parent_category', sa.types.String, nullable=True)
amount = Column('amount', Numeric(10, 2), nullable=False)
recurring = Column('recurring', sa.types.Boolean,
nullable=False)
created_on = Column('created_on', sa.types.DateTime(timezone=True),
nullable=False)
我怎么能说清楚呢。我都不知道该怎么做
感谢您的指点
我使用PostgreSQL
作为后端数据库
5条答案
按热度按时间cwtwac6a1#
我不是100%确定
PostgreSQL
的语法,但是在BudgetCategories
模型中添加以下内容应该可以使用CheckConstraint
:t0ybt7op2#
我在SQLAlchemy模型中需要XOR行为。我提出了以下定义(使用后端:PostgreSQL):
和随后的Alembic迁移(注意:自动生成不会检测到它-您必须手动添加它):
它的作用就像一个魔咒:
-仅笔记本路径-确定
-仅uuid -确定
-uuid和notebook_path -依需要失败
-既不是uuid也不是notebook_path -按要求失败
sh7euo9m3#
我希望还不算太晚,但这应该可以了,它被检查为与PostGreSQL DB一起工作:
bxpogfeg4#
当使用PostgreSQL后端时,您也可以使用num_nonnulls函数来实现此目的:
jdgnovmf5#
几周前我也遇到了这个问题,并在这里提供了解决方案。所以我猜翻译成sqlalchemy(还没有测试!!):
然而出于美观的原因,我更喜欢@andilabs解决方案。为了仍然考虑空字段,我们可以使用另一个solution from here并编写:
不是所有片段中最短的,我承认...