【问题标题】:SQLAlchemy: Assign value to a relationship columnSQLAlchemy:为关系列赋值
【发布时间】:2019-12-13 12:54:02
【问题描述】:

我已经定义了这些 SQLAlchemy 模型:

class Person(db.Model):
    id = db.Column(db.Integer, primar_key=True)
    pets = db.relationship("Pet", backref="person", lazy=True)

class Pet(db.Model):
    id = db.Column(db.Integer, primar_key=True)
    name = db.Column(db.String(120))
    person = db.Column(db.Integer, db.ForeignKey("person.id"))

我正在尝试分配/覆盖 Person.pets 以供以后使用(但不更新 db 中的值)。

person_with_temporary_pet = {1: ["Max", "Charlie", "Cooper"], 2: ["Buddy", "Rocky", "Millo"]}
overwrited_person = []

for id, name in person_with_temporary_pet.items():
    person = Person.query.get(id)
    person.pets = name
    overwrited_person.append(person)

这将导致AttributeError: 'str' object has no attribute '_sa_instance_state'


仅供参考,我想将 overwrited_person 转储到 Marshmallow 架构中:

class PersonSchema(ma.ModelSchema):
    class Meta:
        model = Person

person_schema = PersonSchema(many=True)   

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你在错误的类中定义了你的宠物关系,你需要把它放在宠物类本身。 person_obj.pets 包含一个 Pet 对象列表,而您正尝试为其分配字符串列表。要在您的场景中工作,您可以更改您的 for 循环代码,如下所示:

    for id, name in person_with_temporary_pet.items():
        person = Person.query.get(id)
        person.pets = Pet.query.filter(Pet.name.in_(name)).all()
        overwrited_person.append(person)
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      这可能与this question有关。

      在您的情况下,您在 Person 中定义 Pets 模式,但尝试传递字符串值数组而不是对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2016-09-30
        • 2012-02-23
        • 2015-12-04
        • 1970-01-01
        • 2019-06-21
        相关资源
        最近更新 更多