2017-01-23 45 views
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 

有什麼想法?我知道還有其他的構造方法,但我希望有一個非常直接的直接繼承模型。

回答

1

您不能通過致電​​訪問城市。由於system.planets是行星列表,您需要分別訪問每個行星的cities

for planet in system.planets: 
    print planet.cities 
+0

謝謝你的看法,我完全錯誤地看着它,這讓我走上了正軌! – Retro