私は、ProjectsとPlatesのモデルを含むFlaskで構築しているアプリケーションを持っています。ここでPlatesはProjectを外部キーとして持っています。フラスコsqlalchemy外部キー属性を持つUniqueConstraint
各プロジェクトには1年があり、整数として与えられます(2017年は17です)。各プレートには、プレートの年とプレート番号から構成された番号と名前があります。例えば、今年行われたプロジェクトからのPlate 106は、 '17 -0106'という名前になります。私はこの名前がユニークであることを望みます。ここで
は私のモデルです:
class Project(Model):
__tablename__ = 'projects'
id = Column(Integer, primary_key=True)
name = Column(String(64),unique=True)
year = Column(Integer,default=datetime.now().year-2000)
class Plate(Model):
__tablename__ = 'plates'
id = Column(Integer, primary_key=True)
number = Column(Integer)
project_id = Column(Integer, ForeignKey('projects.id'))
project = relationship('Project',backref=backref('plates',cascade='all, delete-orphan'))
@property
def name(self):
return str(self.project.year) + '-' + str(self.number).zfill(4)
私の最初のアイデアは、同じproject.year属性を持つプレートの間で番号を一意にすることだったので、私は __table_args__ = (UniqueConstraint('project.year', 'number', name='_year_number_uc'),)
のバリエーションを試してみましたが、これはする必要があります他のテーブルにアクセスします。
データベースでこれを行う方法はありますか?または、数字/ project.yearの組み合わせ、または名前のプロパティの一意性をチェックする__init__
メソッドが失敗しましたか?