所以我正在做一些学习,并且我已经遵循了一些关于 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 本机数据类配置。
通过以下方法解决。保留使用 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)