SQLAlchemy与多表上的同一表的多重关系

时间:2020-09-14 13:39:50

标签: python sqlite sqlalchemy flask-sqlalchemy

我有3个模型,我想将NatRule表与其他表之间的关系更改为多对多:

class Address(db.Model):
    __tablename__ = 'address'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(255, collation='NOCASE'), nullable=False, unique=True)
    addr_type = db.Column(db.Text(), nullable=False) # Available types: "fqdn, range, netmask, geo(CN)"
    addr_value = db.Column(db.Text())
    created_at = db.Column(db.TIMESTAMP, server_default=func.now())
    updated_at = db.Column(db.TIMESTAMP, server_default=func.now(), onupdate=func.current_timestamp())

    def __unicode__(self):
        return ("[%s(%s)]" % (self.__class__.__name__, ', '.join('%s=%s' % (k, self.__dict__[k]) for k in sorted(self.__dict__) if '_sa_' != k[:4])))

class Service(db.Model):
    __tablename__ = 'service'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(255, collation='NOCASE'), nullable=False, unique=True)
    category = db.Column(db.Text())
    protocol = db.Column(db.Text())
    start_port = db.Column(db.Text())
    end_port = db.Column(db.Text())
    created_at = db.Column(db.TIMESTAMP, server_default=func.now())
    updated_at = db.Column(db.TIMESTAMP, server_default=func.now(), onupdate=func.current_timestamp())

    def __unicode__(self):
        return ("[%s(%s)]" % (self.__class__.__name__, ', '.join('%s=%s' % (k, self.__dict__[k]) for k in sorted(self.__dict__) if '_sa_' != k[:4])))

class NatRule(db.Model):
    __tablename__ = 'nat_rule'
    id = db.Column(db.Integer(), primary_key=True)
    active = db.Column('is_active', db.Boolean(), nullable=False, server_default='1')
    name = db.Column(db.String(255, collation='NOCASE'), nullable=False)
    rule_type = db.Column(db.String(255, collation='NOCASE'), nullable=False) # IPv4 or IPv6
    action = db.Column(db.Text())
    comment = db.Column(db.Text())
    log = db.Column(db.Boolean(), nullable=False, server_default='1')
    firewalls = db.relationship("FwNatRules", back_populates="rule")
    created_at = db.Column(db.TIMESTAMP, server_default=func.now())
    updated_at = db.Column(db.TIMESTAMP, server_default=func.now(), onupdate=func.current_timestamp())

    # Foreign key assignments for relationships
    original_src_id = db.Column(db.Integer(), db.ForeignKey(Address.id, ondelete='CASCADE'))
    original_dst_id = db.Column(db.Integer(), db.ForeignKey(Address.id, ondelete='CASCADE'))
    original_srv_id = db.Column(db.Integer(), db.ForeignKey(Service.id, ondelete='CASCADE'))
    translated_src_id = db.Column(db.Integer(), db.ForeignKey(Address.id, ondelete='CASCADE'))
    translated_dst_id = db.Column(db.Integer(), db.ForeignKey(Address.id, ondelete='CASCADE'))
    translated_srv_id = db.Column(db.Integer(), db.ForeignKey(Service.id, ondelete='CASCADE'))
    interface_in_id = db.Column(db.Integer(), db.ForeignKey(Interface.id, ondelete='CASCADE'))
    interface_out_id = db.Column(db.Integer(), db.ForeignKey(Interface.id, ondelete='CASCADE'))
    time_profile_id = db.Column(db.Integer(), db.ForeignKey(TimeProfile.id, ondelete='CASCADE'))

    # Relationship definitions for access the objects directly like "nat_rule.original_src".
    original_src = db.relationship("Address", foreign_keys=[original_src_id], backref=db.backref("nat_original_src", uselist=True))
    original_dst = db.relationship("Address", foreign_keys=[original_dst_id], backref=db.backref("nat_original_dst", uselist=True))
    original_srv = db.relationship("Service", foreign_keys=[original_srv_id], backref=db.backref("nat_original_srv", uselist=True))
    translated_src = db.relationship("Address", foreign_keys=[translated_src_id], backref=db.backref("nat_translated_src", uselist=True))
    translated_dst = db.relationship("Address", foreign_keys=[translated_dst_id], backref=db.backref("nat_translated_dst", uselist=True))
    translated_srv = db.relationship("Service", foreign_keys=[translated_srv_id], backref=db.backref("nat_translated_srv", uselist=True))

我想将NatRule表中的关系类型更改为多对多,但我不希望描述该表中每一列的辅助表。 (例如,original_src_id,original_dst_id,translated_src和Translation_dst等。)因为它们与同一张表具有关系。所以也许还有其他一些python方法可以做到这一点?

0 个答案:

没有答案