【问题标题】:SQLalchemy/Flask - nested one to oneSQLalchemy/Flask - 一对一嵌套
【发布时间】:2017-01-23 21:08:21
【问题描述】:

我正在尝试使用 Flask+SQLAlchemy 来创建程序宇宙。每个系统都有行星,每个行星都有城市等等。

这一切看起来都很简单(著名的遗言),但我收到以下错误:

' Traceback(最近一次调用最后一次):第 75 行,in 打印系统.planets.cities AttributeError: 'InstrumentedList' 对象没有属性 'cities' '

当我运行以下内容时:

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

有什么想法吗?我知道还有其他构造事物的方法,但我希望有一个非常简单的直接继承模型。

【问题讨论】:

    标签: python sql flask sqlalchemy


    【解决方案1】:

    您无法通过拨打print system.planets.cities 访问这些城市。由于 system.planets 是行星列表,您需要分别访问每个行星的 cities

    for planet in system.planets:
        print planet.cities
    

    【讨论】:

    • 谢谢你,我完全看错了,这让我走上了正轨!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 2021-09-07
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多