跳转到主要内容

混合器 -- 是一个固定装置的替代品。支持Django ORM、SqlAlchemy ORM、Mongoengine ODM和自定义Python对象。

项目描述

https://raw.github.com/klen/mixer/develop/docs/_static/logo.png

混合器 是生成Django或SqlAlchemy模型实例的辅助工具。它对测试和固定装置替代品很有用。快速方便的测试数据生成。

混合器支持

Tests Status Version Downloads License

文档可在 https://mixer.readthedocs.org/ 找到。包含文档改进和/或修复的拉取请求非常棒,非常受欢迎。

俄语描述: http://klen.github.io/mixer.html

要求

  • Python 3.7+

  • Django(3.0,3.1)用于Django ORM支持;

  • Flask-SQLAlchemy用于SQLAlchemy ORM支持和作为Flask应用程序的集成;

  • Faker >= 0.7.3

  • Mongoengine用于Mongoengine ODM支持;

  • SQLAlchemy用于SQLAlchemy ORM支持;

  • Peewee ORM支持;

安装

Mixer应使用pip安装

pip install mixer

使用

默认情况下,Mixer尝试生成伪造的(人性化的)数据。
如果您想随机化生成的值,请手动初始化Mixer
:Mixer(fake=False)
默认情况下,Mixer将生成的对象保存到数据库中。如果您想禁用
这,请手动初始化Mixer,如Mixer(commit=False)

Django工作流程

快速示例

from mixer.backend.django import mixer
from customapp.models import User, UserMessage

# Generate a random user
user = mixer.blend(User)

# Generate an UserMessage
message = mixer.blend(UserMessage, user=user)

# Generate an UserMessage and an User. Set username for generated user to 'testname'.
message = mixer.blend(UserMessage, user__username='testname')

# Generate SomeModel from SomeApp and select FK or M2M values from db
some = mixer.blend('someapp.somemodel', somerelation=mixer.SELECT)

# Generate SomeModel from SomeApp and force a value of money field from default to random
some = mixer.blend('someapp.somemodel', money=mixer.RANDOM)

# Generate SomeModel from SomeApp and skip the generation of money field
some = mixer.blend('someapp.somemodel', money=mixer.SKIP)

# Generate 5 SomeModel's instances and take company field's values from custom generator
some_models = mixer.cycle(5).blend('somemodel', company=(name for name in company_names))

Flask,Flask-SQLAlchemy

快速示例

from mixer.backend.flask import mixer
from models import User, UserMessage

mixer.init_app(self.app)

# Generate a random user
user = mixer.blend(User)

# Generate an userMessage
message = mixer.blend(UserMessage, user=user)

# Generate an UserMessage and an User. Set username for generated user to 'testname'.
message = mixer.blend(UserMessage, user__username='testname')

# Generate SomeModel and select FK or M2M values from db
some = mixer.blend('project.models.SomeModel', somerelation=mixer.SELECT)

# Generate SomeModel from SomeApp and force a value of money field from default to random
some = mixer.blend('project.models.SomeModel', money=mixer.RANDOM)

# Generate SomeModel from SomeApp and skip the generation of money field
some = mixer.blend('project.models.SomeModel', money=mixer.SKIP)

# Generate 5 SomeModel's instances and take company field's values from custom generator
some_models = mixer.cycle(5).blend('project.models.SomeModel', company=(company for company in companies))

支持具有 __init__ 参数的Flask-SQLAlchemy模型

为了支持此方案,只需创建自己的mixer类,如下所示

from mixer.backend.sqlalchemy import Mixer

class MyOwnMixer(Mixer):

    def populate_target(self, values):
        target = self.__scheme(**values)
        return target

mixer = MyOwnMixer()

SQLAlchemy工作流程

初始化示例

from mixer.backend.sqlalchemy import Mixer

ENGINE = create_engine('sqlite:///:memory:')
BASE = declarative_base()
SESSION = sessionmaker(bind=ENGINE)

mixer = Mixer(session=SESSION(), commit=True)
role = mixer.blend('package.models.Role')

有关更多信息,请参阅FlaskFlask-SQLAlchemy

Mongoengine工作流程

示例用法

from mixer.backend.mongoengine import mixer

class User(Document):
    created_at = DateTimeField(default=datetime.datetime.now)
    email = EmailField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
    username = StringField(max_length=50)

class Post(Document):
    title = StringField(max_length=120, required=True)
    author = ReferenceField(User)
    tags = ListField(StringField(max_length=30))

post = mixer.blend(Post, author__username='foo')

棉花糖工作流程

示例用法

from mixer.backend.marshmallow import mixer
import marshmallow as ma

class User(ma.Schema):
    created_at = ma.fields.DateTime(required=True)
    email = ma.fields.Email(required=True)
    first_name = ma.fields.String(required=True)
    last_name = ma.fields.String(required=True)
    username = ma.fields.String(required=True)

class Post(ma.Schema):
    title = ma.fields.String(required=True)
    author = ma.fields.Nested(User, required=True)

post = mixer.blend(Post, author__username='foo')

常用方法

快速示例

from mixer.main import mixer

class Test:
    one = int
    two = int
    name = str

class Scheme:
    name = str
    money = int
    male = bool
    prop = Test

scheme = mixer.blend(Scheme, prop__one=1)

数据库提交

默认情况下,“django”、“flask”、“mongoengine”后端尝试在数据库中保存对象。为防止此行为,请手动初始化

from mixer.backend.django import Mixer

mixer = Mixer(commit=False)

或您可以使用mixer作为上下文管理器临时切换上下文

from mixer.backend.django import mixer

# Will be save to db
user1 = mixer.blend('auth.user')

# Will not be save to db
with mixer.ctx(commit=False):
    user2 = mixer.blend('auth.user')

自定义字段

Mixer允许您通过手动定义字段的生成器。快速示例

from mixer.main import mixer

class Test:
    id = int
    name = str

mixer.register(Test,
    name=lambda: 'John',
    id=lambda: str(mixer.faker.small_positive_integer())
)

test = mixer.blend(Test)
test.name == 'John'
isinstance(test.id, str)

# You could pinned just a value to field
mixer.register(Test, name='Just John')
test = mixer.blend(Test)
test.name == 'Just John'

您还可以为字段类型创建自己的工厂

from mixer.backend.django import Mixer, GenFactory

def get_func(*args, **kwargs):
    return "Always same"

class MyFactory(GenFactory):
    generators = {
        models.CharField: get_func
    }

mixer = Mixer(factory=MyFactory)

中间件

您可以将中间件层添加到处理中

from mixer.backend.django import mixer

# Register middleware to model
@mixer.middleware('auth.user')
def encrypt_password(user):
    user.set_password('test')
    return user

您可以将多个中间件添加。每个中间件应获取一个参数(生成的值)并返回它们。

也可以注销中间件

mixer.unregister_middleware(encrypt_password)

地区

默认情况下,mixer使用“en”地区。您可以通过创建自己的mixer切换mixer默认地区

from mixer.backend.django import Mixer

mixer = Mixer(locale='it')
mixer.faker.name()          ## u'Acchisio Conte'

您可以在任何时候切换mixer当前地区

mixer.faker.locale = 'cz'
mixer.faker.name()          ## u'Miloslava Urbanov\xe1 CSc.'

mixer.faker.locale = 'en'
mixer.faker.name()          ## u'John Black'

# Use the mixer context manager
mixer.faker.phone()         ## u'1-438-238-1116'
with mixer.ctx(locale='fr'):
    mixer.faker.phone()     ## u'08 64 92 11 79'

mixer.faker.phone()         ## u'1-438-238-1116'

错误追踪器

如果您有任何建议、错误报告或烦恼,请向https://github.com/klen/mixer/issues的问题跟踪器报告

贡献

mixer的开发在Github上:https://github.com/klen/mixer

贡献者

许可证

许可协议为BSD许可。

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

mixer-7.2.2.tar.gz (49.6 kB 查看散列值)

上传时间

构建分布

mixer-7.2.2-py3-none-any.whl (38.5 kB 查看散列值)

上传时间 Python 3

支持者