SQLAlchemy: проектирование отношений «многие ко многим» с ограничением уникальности - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь спроектировать отношения между этими двумя объектами в моей модели:
A Lick - это упорядоченная последовательность Note с (которая, в свою очередь, может быть частью разных лицензий), поэтому я решилареализовать многие-ко-многим с полем позиции в классе ассоциации.Я хотел бы добавить уникальное ограничение в мой класс Lick, чтобы избежать дублирования, но я не знаю, как это сделать способом ORM.Единственное решение, которое я придумала, - это установить настраиваемое поле id в классе Lick (вместо обычного инкрементного целого числа), которое, я уверен, является уникальным, но я чувствую, что я в основном перекодирую вСтрока, что уже присутствует в базе данных.Есть ли способ установить уникальное поле в классе Lick, которое относится к упорядочению его заметок?

Заранее спасибо.Ниже вы можете увидеть мою модель:

class LickNote(db.Model):
    __tablename__ = 'lick_note'
    __table_args__ = (
        db.ForeignKeyConstraint(('note_string', 'note_fret', 'note_value'),
                                ('note.string', 'note.fret', 'note.value')),
    )
    lick_id = db.Column(db.String, db.ForeignKey('lick.id'), primary_key=True)
    note_string = db.Column(db.Integer, primary_key=True)
    note_fret = db.Column(db.Integer, primary_key=True)
    note_value = db.Column(db.Integer, primary_key=True)
    position = db.Column(db.Integer)
    notes = db.relationship("Note")


class Lick(db.Model):
    """
    A lick is identified as a sequence of notes. The identifier is a string in this form:
    ssffvvssffvv.....ssffvv, where ss refers to the string (00-12), ff to the fret (00-23) and vv to the value of the
    note (00-11). This sequence is guaranteed to be unique 
    """
    __tablename__ = 'lick'

    id = db.Column(db.String, primary_key=True)
    notes = db.relationship("LickNote")



class Note(db.Model):
    """
    Value represents the int conversion of the note [0,11]. Marked as primary to identify the possibility of having
    different tunings for the same position on the fretboard
    """
    __tablename__ = 'note'

    string = db.Column(db.Integer, primary_key=True)
    fret = db.Column(db.Integer, primary_key=True)
    value = db.Column(db.Integer, primary_key=True)
...