1
我正在嘗試使用Flask + SQLAlchemy創建一個程序化的Universe。每個系統都有行星,每個行星都有個城市等等,等等SQLalchemy/Flask - 一對一嵌套
這一切似乎相當直截了當(鬼才),但我發現了以下錯誤:
「回溯(最近通話最後):線75,在 打印system.planets.cities AttributeError的: 'InstrumentedList' 對象沒有屬性 '城市''
當我運行下面:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import libtcodpy as libtcod
import random
app = Flask(__name__)
db = SQLAlchemy(app)
class System(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
planets = db.relationship('Planet', backref='system')
def __repr__(self):
return '<System:{}>'.format(self.name)
class Planet(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
system_id = db.Column(db.Integer, db.ForeignKey('system.id'))
cities = db.relationship('City', backref='planet')
def __repr__(self):
return '<Planet:{}>'.format(self.name)
class City(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
pop = db.Column(db.Integer)
planet_id = db.Column(db.Integer, db.ForeignKey('planet.id'))
def __repr__(self):
return '<City:{}>'.format(self.name)
with app.app_context():
db.create_all()
def init_systems():
sysnum = random.randint(5,10)
#init namegenerator
libtcod.namegen_parse('data/systemnames.txt')
while sysnum > 0:
plannum = random.randint(3,8)
sname = libtcod.namegen_generate('Systems')
gensys = System(name=sname)
gensys.planets = []
while plannum > 0:
pname = libtcod.namegen_generate('Planets')
genplan = Planet(name=pname)
genplan.cities = []
citynum = random.randint(4,12)
while citynum > 0:
startpop = random.randint(10,1000)
cname = libtcod.namegen_generate('Cities')
gencit = City(name=cname, pop=startpop)
genplan.cities.append(gencit)
citynum -= 1
gensys.planets.append(genplan)
plannum -= 1
db.session.add(gensys)
db.session.commit()
sysnum -= 1
init_systems()
system = System.query.first()
print system.name
print system.planets
print system.planets.cities
有什麼想法?我知道還有其他的構造方法,但我希望有一個非常直接的直接繼承模型。
謝謝你的看法,我完全錯誤地看着它,這讓我走上了正軌! – Retro