Adnix
Adnix

Reputation: 47

Many To Many Relation - delete item

Models:

class Cecha(db.Model):
    __tablename__='cechy'
    id = db.Column(db.Integer, primary_key = True)
    nazwa = db.Column(db.String)

cechy_asort = db.Table('cechy_asort',
    db.Column('id_cechy', db.Integer, db.ForeignKey('cechy.id')),
    db.Column('id_asortymentu', db.Integer, db.ForeignKey('asortymenty.id')))

class Asortyment(db.Model):
    __tablename__ = 'asortymenty'
    id = db.Column(db.Integer, primary_key=True)
    nazwa = db.Column(db.String(64), unique = True, index = True, nullable = False)

    zamowienia = db.relationship('Zamowienie', backref='asortyment', lazy='dynamic', cascade='all,delete')
    cecha = db.relationship('Cecha', secondary=cechy_asort, backref=db.backref('asortymenty', lazy='dynamic'), lazy='joined')

    def ma_ceche(self, id_cechy):
        cecha = Cecha.query.filter_by(id=id_cechy).first()
        if cecha is None:
            return False
        if not cecha in self.cecha:
            return False
        return cecha

    def dodaj_ceche(self,id_cechy):
        if not self.ma_ceche(id_cechy):
            cecha = Cecha.query.filter_by(id=id_cechy).first()
            self.cecha.append(cecha)
            db.session.commit()

    def usun_ceche(self,id_cechy):
        if self.ma_ceche(id_cechy):
            cecha = Cecha.query.filter_by(id=id_cechy).first()
            self.cecha.remove(cecha)
            db.session.commit()

class Grupa_asort(db.Model):
    __tablename__ = 'grupy_asort'
    id = db.Column(db.Integer, primary_key=True)
    nazwa = db.Column(db.String(64), unique = True, index = True)

    asortymenty = db.relationship('Asortyment', backref = 'grupa_asort', lazy='dynamic', cascade='all,delete')

The problem is with deleting item from table Asortyment if there is relation:

 Asortyment.query.filter_by(id_grupy=id_grupy).delete()

The error is: cursor.execute(statement, parameters) psycopg2.errors.ForeignKeyViolation: update or delete on table "asortymenty" violates foreign key constraint "cechy_asort_id_asortymentu_fkey" on table "cechy_asort" DETAIL: Key (id)=(1446) is still referenced from table "cechy_asort".

Upvotes: 1

Views: 138

Answers (1)

Adnix
Adnix

Reputation: 47

cechy_asort = db.Table('cechy_asort',
    db.Column('id_cechy', db.Integer, db.ForeignKey('cechy.id')),
    db.Column('id_asortymentu', db.Integer, db.ForeignKey('asortymenty.id', ondelete="CASCADE")))   

Upvotes: 1

Related Questions