从python混合器接收空值

cll*_*ach 1 python unit-testing fixtures flask flask-sqlalchemy

我正在尝试使用greate库混合器生成一些夹具来测试Flask应用程序。我已经在Django项目上使用了它,并且运行良好,但是在flask + sqlalchemy上,无论我做什么我都会收到空值。

from mixer.backend.flask import mixer
from models import Users
from myproj import app

mixer.init_app(app)

me.blend(Users)
Run Code Online (Sandbox Code Playgroud)

返回null。

我也尝试直接实例化该应用程序。

from mixer.backend.flask import Mixer
from models import Users
from myproj import app

mixer = Mixer(app=app)

me = mixer.blend(Users)
Run Code Online (Sandbox Code Playgroud)

返回相同的空值。

两种情况都返回一个自动生成的ID。并且保存到数据库,但是所有字段都为Null。

知道为什么吗?

谢谢

Doo*_*beh 6

事实证明,这是一个简单的答案-Mixer不会为可为null的字段生成数据。因此,可以在模型中指定它,例如,这可以工作:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from mixer.backend.flask import mixer

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'

db = SQLAlchemy(app)
mixer.init_app(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
        user = mixer.blend(User)
        print user.id, user.username

        # Prints: 1 collins1995
Run Code Online (Sandbox Code Playgroud)

或者,如果您想让它们保持可空状态,请告诉Mixer您希望它生成哪些字段:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from mixer import fakers as f
from mixer.backend.flask import mixer

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'

db = SQLAlchemy(app)
mixer.init_app(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __repr__(self):
        return '<User %r>' % self.username

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
        user = mixer.blend(User, username=f.get_username(), email=f.get_email())
        print user.id, user.username, user.email

        # Prints: 1 lover_boots robinson1963@google.vn
Run Code Online (Sandbox Code Playgroud)

感谢Mixer的作者klen 提供的解决方案

  • 感谢@doobeh,但是关于第二种情况的更多信息:不必使用混合器伪造者来强制设置可为空的值,混合器具有一个神奇的属性`mixer.R`来完成工作:`user = mixer.blend(用户,用户名= mixer.R,电子邮件= mixer.R)` (3认同)