.. _models_creation:

Models creation
===============

You can get model instance saved in database without secifying any model fields::

Given you have a simple polls model from django tutorial::

    #models.py
    class Poll(models.Model):
        question = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')

You can create random poll instance not having to provide question text or pub_date,
if they're not relevant for your test case::

    #tests.py
    from django_any import any_model
    user = any_model(Book)

It will create a book instance with both fields filled with meaningless but valid data::

    'question': 'KStKMESUXDjnlDNcJLsAiLcZQGnVXhORIKxWYtPwiqgVXgFvgpmMajwbGFRkoCo'
    'pub_date': datetime.datetime(2002, 10, 1, 6, 1, 16)


django-any will fill all required foreign keys and create related model instances as well.

Specifying values
~~~~~~~~~~~~~~~~~

If you need an instance with specific values you can provide them this way::

    user = any_model(Poll, question='To be or not ot be?')

Note, that ``pub_date`` will still be generated randomly for you.::

    'question': 'To be or not ot be?'
    'pub_date': datetime.datetime(2004, 5, 11, 16, 48, 35)


Constraints
~~~~~~~~~~~

django-any will preserve all field constraints, such as max_length,
and choices when filling models with random data.
It also tries to honor model custom validation by making model instances until
``full_clean()`` returns ``True``.

Relations
~~~~~~~~~

django-any supports Django ORM-like `double-underscore` syntax
for setting values for related instances::

    #models.py
    class Choice(models.Model):
        poll = models.ForeignKey(Poll)
        choice = models.CharField(max_length=200)
        votes = models.IntegerField()

    #tests.py
    order = any_model(Order, poll__pub_date = datetime.now())


Fixtures
~~~~~~~~

In case you need data from fixtures for creation of your models you can use ``Q`` objects
to select values for fields from db::

     order = any_model(Order, customer__location=Q(country='US'))
     
It will create an order for existing customer, whose country is US.


Custom model fields
~~~~~~~~~~~~~~~~~~~

It's quite common to create custom model fields to store data. To let django-any know how to
generate random data for this filed you should register it explicitly::

    @any_field.register(model_utils.field.AutoCreatedField)
    def any_auto_created_field(field, **kwargs):
        return datetime.datetime.now()

