Mixer is application to generate instances of Django or SQLAlchemy models. It's useful for testing and fixtures replacement. Fast and convenient test-data generation.
Mixer supports:
- Django;
- SQLAlchemy;
- Flask-SqlAlchemy;
- Mongoengine;
- Custom schemes;
Docs are available at https://mixer.readthedocs.org/. Pull requests with documentation enhancements and/or fixes are awesome and most welcome.
Описание на русском языке: http://klen.github.io/mixer-ru.html
- python (2.6, 2.7, 3.2, 3.3)
- Django (1.4, 1.5, 1.6) for django ORM suport;
- SQLAlchemy for SQLAlchemy ORM suport;
- Mongoengine for Mongoengine ODM support;
- Flask-SQLALchemy for SQLAlchemy ORM suport and integration as Flask application;
Mixer should be installed using pip: :
pip install mixer
By default Mixer try to generate fake data. If you want randomize values
initialize the Mixer by manual like: Mixer(fake=False)By default Mixer saves generated objects in database. If you want disable
this, initialize the Mixer by manual like: Mixer(commit=False)
Quick example: :
from mixer.backend.django import mixer
from customapp.models import User, UserMessage
# Generate random User
user = mixer.blend(User)
# Generate UserMessage
message = mixer.blend(UserMessage, user=user)
# Generate UserMessage and User. Set User.username 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 field with default to random
some = mixer.blend('someapp.somemodel', money=mixer.RANDOM)
# Generate 5 SomeModel instances and get a field values from custom generator
some_models = mixer.cycle(5).blend('somemodel', company=(company for company in companies))
Quick example: :
from mixer.backend.flask import mixer
from models import User, UserMessage
mixer.init_app(self.app)
# Generate random User
user = mixer.blend(User)
# Generate UserMessage
message = mixer.blend(UserMessage, user=user)
# Generate UserMessage and User. Set User.username 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 field with default to random
some = mixer.blend('project.models.SomeModel', money=mixer.RANDOM)
# Generate 5 SomeModel instances and get a field values from custom generator
some_models = mixer.cycle(5).blend('project.models.SomeModel', company=(company for company in companies))
Example of initialization: :
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')
Also see Flask, Flask-SQLALchemy.
Example usage: :
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)
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')
Quick example: :
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)
By default 'django', 'flask', 'mongoengine' backends tries to save objects to database. For prevent this behaviour init mixer manually: :
from mixer.backend.django import Mixer
mixer = Mixer(commit=False)
Or you can use mixer with custom params as context: :
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 allows you to define generators for fields by manualy.
Quick example: :
from mixer.main import mixer
class Test:
id = int
name = str
mixer.register(Test, {
'name': lambda: 'John',
'id': lambda: str(mixer.g.get_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'
Also you can make your ow factory for field types: :
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)
If you have any suggestions, bug reports or annoyances please report them to the issue tracker at https://github.com/klen/mixer/issues
Development of starter happens at github: https://github.com/klen/mixer
Licensed under a BSD license.