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オブジェクトとGeolocationオブジェクトの間には1対1の関係があるため、Geolocationには、たとえば2人のユーザー(またはユーザーと場所)の場所が同時に含まれることはありません。次に、Pinをサブクラス化してUserクラスを作成します。Userオブジェクトには、名前、password_hash、saltが必要です。また、を介してユーザーのジオロケーションを検索できるようにする必要がありますuserObj.geolocation
。ただし、後でPinをサブクラス化するクラスPlaceを作成したいので、を介してPlaceのジオロケーションを検索できるようにする必要がありますplaceObj.geolocation
。ジオロケーションオブジェクトが与えられれば、私は使用できるはずですgeolocationObj.pin
ユーザー/場所などを検索します。ジオロケーションオブジェクトが対応する。user_id
私がスーパークラスのPinを導入した理由は、Geolocationテーブルにplace_id
列が必要なUserまたはPersonにGeolocationを関連付けるのではなく、PinオブジェクトとGeolocationオブジェクトの間に純粋な1対1の関係があることを確認するためでした。そのうちの1つは常にnullになります。
ジオロケーションを参照する親Pinクラスを介して、すべてのユーザーが自動的に.geolocation
プロパティを持つことを期待していましたが、SQLAlchemyはこれを行わないようです。User and Placeと潜在的に他のクラスにPinをサブクラス化し、それらの各クラスにPinを介したジオロケーションプロパティを持たせ、PinとGeolocationの間に1対1の関係を持たせるという目標を達成するために、サブクラス化関係を機能させるにはどうすればよいですか?