class Geolocation(db.Model):
__tablename__ = "geolocation"
id = db.Column(db.Integer, primary_key=True)
latitude = db.Column(db.Float)
longitude = db.Column(db.Float)
elevation = db.Column(db.Float) # Meters
# Relationships
pin = db.relationship('Pin', uselist=False, backref="geolocation")
def __init__(self, latitude, longitude, elevation):
self.latitude = latitude
self.longitude = longitude
self.elevation = elevation
def __repr__(self):
return '<Geolocation %s, %s>' % (self.latitude, self.longitude)
class Pin(db.Model):
__tablename__ = "pin"
id = db.Column(db.Integer, primary_key=True)
geolocation_id = db.Column(db.Integer, db.ForeignKey('geolocation.id')) # True one to one relationship (Implicit child)
def __init__(self, geolocation_id):
self.geolocation_id = geolocation_id
def __repr__(self):
return '<Pin Object %s>' % id(self) # Instance id merely useful to differentiate instances.
class User(Pin):
#id = db.Column(db.Integer, primary_key=True)
pin_id = db.Column(db.Integer, db.ForeignKey('pin.id'), primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(120), nullable=False)
salt = db.Column(db.String(120), nullable=False)
# Relationships
#posts = db.relationship('Post', backref=db.backref('user'), lazy='dynamic') #One User to many Postings.
def __init__(self, username, password_hash, salt, geolocation_id):
super(Pin, self).__init__(self, geolocation_id)
self.username = username
self.password_hash = password_hash
self.salt = salt
def __repr__(self):
return '<User %r>' % self.username
我对如何在 SQLAlchemy 中设置 id 和与子类的关系感到困惑(我碰巧使用的是 Flask-SQLAlchemy)。我的总体设计是让超类 Pin 成为具有地理位置的任何事物(即用户、地点等)的高级表示。
Pin 和 Geolocation 对象之间存在一对一的关系,因此 Geolocation 不会同时包含两个用户(或用户和地点)的位置。现在我想继承 Pin 来创建 User 类。用户对象应该有一个名称、密码哈希、盐,我还希望能够通过userObj.geolocation
. 但是,我后来想创建一个类 Place ,它也是 Pin 的子类,我应该能够通过placeObj.geolocation
. 给定一个地理位置对象,我应该可以使用geolocationObj.pin
查找用户/地点/等。对应的地理位置对象。我引入超类 Pin 的全部原因是确保 Pin 和 Geolocation 对象之间存在纯粹的一对一关系,而不是让 Geolocation 与需要 Geolocation 表具有user_id
和place_id
列的 User 或 Person 相关联,其中之一将始终为空。
我希望每个用户都能.geolocation
通过父 Pin 类自动拥有一个属性,该属性引用 Geolocation 但似乎 SQLAlchemy 没有这样做。我怎样才能使子类关系起作用以实现我的目标,即让 User 和 Place 以及可能的其他类子类 Pin,让这些类中的每一个都具有通过 Pin 的地理位置属性,并且在 Pin 和地理位置之间具有一对一的关系?