SQLAlchemy 和 proxy_association 给出使用 default_factory 错误

问题描述 投票:0回答:1

所以我正在做一些学习,并且我已经遵循了一些关于 Flask-SQLAlchemy 和 Python 数据类的在线教程。我已将我的应用程序设置为沼泽标准,因为我可以得到:

__init__.py

from flask import Flask, request, jsonify
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://log:pass@localhost/db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
CORS(app)
db = SQLAlchemy(app)

我已经达到了将对象关联模式用于多对多关系的地步,并且效果很好,返回了我需要的内容。我现在想从该关系的中间表 x 中提取一个额外的列。这导致我使用association_proxy。我似乎正确地遵循了我能找到的教程,但是当我启动 Flask 时,我不断收到以下信息:

ValueError:不允许字段 x 的可变默认值 :使用 default_factory

models.py

from typing import List
from dataclasses import dataclass
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import Mapped

from sqlalchemy.ext.associationproxy import association_proxy

from . import db


@dataclass
class Main(db.Model):
    __tablename__="main"
    id: int = db.Column(db.Integer, primary_key=True)
    ones: Mapped[List[One]] = db.relationship("One", secondary="manys", overlaps="main")

@dataclass
class Many(db.Model):
    __tablename__ = "manys"

    main_id = db.Column(db.Integer, db.ForeignKey("main.id"), primary_key=True)
    one_id = db.Column(db.Integer, db.ForeignKey("one.id"), primary_key=True)
    x = db.Column(db.Boolean, nullable=False, default=False)

@dataclass
class One(db.Model):
    __tablename__ = "ones"

    id: int = db.Column(db.Integer, primary_key=True)

    name: str = db.Column(db.String, nullable=False)
    other_id: int = db.Column(db.Integer, nullable=False)

    many_link = db.relationship("Many", backref="ones")
    many_x: Mapped[bool] = association_proxy("many_link", "x")


我做错了什么吗?我错过了什么吗? 如果我将

default_factory=None
添加到我的 proxy_association 中,我会得到

sqlalchemy.exc.ArgumentError:类 上的属性“x”包括数据类参数:“default_factory”,但类未指定 SQLAlchemy 本机数据类配置。

python flask sqlalchemy flask-sqlalchemy python-dataclasses
1个回答
0
投票

通过以下方法解决。保留使用 Main.query.all() 功能的能力。感谢您的指点,@snakecharmerb。

__init__.py

#Model Base Class
class Base(DeclarativeBase, MappedAsDataclass):
    pass


app = Flask(__name__)
app.json = BetterJsonProvider(app)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://login:passwd@localhost/db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
CORS(app)

db = SQLAlchemy(app, model_class=Base)

“数据类”现在看起来像这样:

class Main(db.Model):
    __tablename__="main"
    id: int = db.Column(db.Integer, primary_key=True)
    ones: Mapped[List[One]] = db.relationship("One", secondary="manys", overlaps="many,one")

class Many(db.Model):
    __tablename__ = "manys"

    main_id = db.Column(db.Integer, db.ForeignKey("main.id"), primary_key=True)
    one_id = db.Column(db.Integer, db.ForeignKey("one.id"), primary_key=True)
    x = db.Column(db.Boolean, nullable=False, default=False)

class One(db.Model):
    __tablename__ = "ones"

    id: int = db.Column(db.Integer, primary_key=True)

    name: str = db.Column(db.String, nullable=False)
    other_id: int = db.Column(db.Integer, nullable=False)

    many_link = db.relationship("Many", backref="ones", uselist=False)
    many_x: Mapped[bool] = association_proxy("many_link", "x", default_factory=bool)
© www.soinside.com 2019 - 2024. All rights reserved.