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 (я использую Flask-SQLAlchemy). Мой общий план заключается в том, чтобы суперкласс Pin был высокоуровневым представлением всего, что имеет геолокацию (т. е. пользователя, места и т. д.).
Между булавкой и объектом геолокации существует отношение один к одному, поэтому геолокация не содержит, например, местоположение двух пользователей (или пользователя и места) одновременно. Теперь я хочу создать подкласс Pin для создания класса User. Объект пользователя должен иметь имя, пароль_хэш, соль, и я также хочу иметь возможность искать геолокацию пользователя через userObj.geolocation
. Однако позже я хочу создать класс Place, который также является подклассом Pin, и я должен иметь возможность искать геолокацию Place через placeObj.geolocation
. Учитывая объект геолокации, я должен иметь возможность использовать geolocationObj.pin
для поиска пользователя/места/и т. д. которому соответствует объект геолокации. Вся причина, по которой я представил надкласс Pin, заключалась в том, чтобы гарантировать, что существует чистая связь один к одному между объектами Pin и Geolocation, а не связать Geolocation либо с пользователем, либо с человеком, что потребовало бы, чтобы таблица Geolocation имела user_id
и place_id
столбцы, один из которых всегда будет нулевым.
Я ожидал, что каждый пользователь будет автоматически иметь свойство .geolocation
через родительский класс Pin, который ссылается на геолокацию, но похоже, что SQLAlchemy этого не делает. Как я могу заставить отношения подклассов работать для достижения моей цели иметь User и Place и, возможно, другие классы подкласса Pin, чтобы каждый из этих классов имел свойство геолокации через Pin и имел отношение один к одному между Pin и Geolocation?