2017-01-17 18 views
0

私は、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__メソッドが失敗しましたか?

答えて

0

問題には複数の解決策があります。たとえば、project.year-numberの組み合わせを非正規化し、それを別のPlateフィールドとして格納することができます。次に、固有のキーを置くことができます。問題は、その価値をどのように維持するかということです。 2つの明白なオプションは、トリガーです(DBがトリガーをサポートしていると仮定しても問題ありません)。私はあなたのために重要だと思います。

あなたの質問は、やや類似していますCan SQLAlchemy events be used to update a denormalized data cache?

関連する問題