Field Data Generation¶
Supported Fields¶
- Numbers: IntegerField, SmallIntegerField, PositiveIntegerField, PositiveSmallIntegerField, BigIntegerField, FloatField,DecimalField
- Strings: CharField, TextField, SlugField, CommaSeparatedintegerField
- Booleans: BooleanField, NullBooleanField
- Timestamps: DateField, TimeField, DatetimeField
- Utilities: EmailField, UrlField, IPAddressField, GenericIPAddressField, XMLField, UUIDField
- Files: FilePathField, FileField, ImageField
- Binary: BinaryField
- Postgres: JSONField, ArrayField
- GIS/Django Geo: Geometryfield, PointField, LineStringField, PolygonField, MultiPointField, MultiLineStringField, MultiPolygonField, GeometryCollectionField
Use DDF_FIELD_FIXTURES
settings, customized data or even the field default values to deal with not supported fields.
GeoDjango Fields¶
After 1.8.4 version, DDF has native support for GeoDjango fields: GeometryField, PointField, LineStringField, PolygonField, MultiPointField, MultiLineStringField, MultiPolygonField, GeometryCollectionField.
For older versions of DDF, please, use the following approach:
You can use DDF_FIELD_FIXTURES
to create fixtures for Geo Django fields:
# https://docs.djangoproject.com/en/dev/ref/contrib/gis/
from django.contrib.gis.geos import Point
DDF_FIELD_FIXTURES = {
'django.contrib.gis.db.models.GeometryField': lambda: None,
'django.contrib.gis.db.models.PointField': lambda: None,
'django.contrib.gis.db.models.LineStringField': lambda: None,
'django.contrib.gis.db.models.PolygonField': lambda: None,
'django.contrib.gis.db.models.MultiPointField': lambda: None,
'django.contrib.gis.db.models.MultiLineStringField': lambda: None,
'django.contrib.gis.db.models.MultiPolygonField': lambda: None,
'django.contrib.gis.db.models.GeometryCollectionField': lambda: None,
}
About Custom Fields¶
- Customized data is also valid for unsupported fields.
- You can also set the field fixture using the
DDF_FIELD_FIXTURES
settings. (new in 1.8.0) - if a field is not default in Django, but it inherits from a Django field, it will be filled using its config.
- if a field is not default in Django and not related with a Django field, it will raise an
UnsupportedFieldError
. - if it does not recognize the Field class, it will raise an
UnsupportedFieldError
.
Fill Nullable Fields¶
This option define if nullable fields (fields with null=True
) will receive a generated data or not (data=None
). This property is exclusive for non-FK fields. It is possible to override the global option for an specific instance. But be careful because this option will be propagate to all internal dependencies.
In settings.py:
DDF_FILL_NULLABLE_FIELDS = True
In the test file:
instance = G(MyModel, fill_nullable_fields=False)
assert instance.a_nullable_field is None
assert instance.a_required_field is not None
instance = G(MyModel, fill_nullable_fields=True)
assert instance.a_nullable_field is not None
assert instance.a_required_field is not None
Ignoring Fields (New in 1.2.0)¶
This option defines a list of fields DDF will ignore. In other words, DDF will not fill it with dynamic data. This option can be useful for fields auto calculated by models, like [MPTT](https://github.com/django-mptt/django-mptt) models. Ignored fields are propagated ONLY to self references.
In settings.py:
DDF_IGNORE_FIELDS = ['field_x', 'field_y'] # default = []
Ignored field names can use wildcard matching with ‘*’ and ‘?’ characters which substitute multiple or one character respectively. Wildcards are useful for fields that should not be populated and which match a pattern, like *_ptr
fields for [django-polymorphic](https://github.com/django-polymorphic/django-polymorphic).
In settings.py:
DDF_IGNORE_FIELDS = ['*_ptr'] # Ignore django-polymorphic pointer fields
It is not possible to override the global configuration, just extend the list. So use global option with caution:
instance = G(MyModel, ignore_fields=['another_field_name'])
assert instance.another_field_name is None
Minimum Foreign Key Depth¶
This option is used by DDF to control dependencies and cyclic dependencies (ForeignKey
by self
, denormalizations, bad design etc). DDF does not enter infinite loop of instances generation. This option defines how depth DDF should go to create instances of foreign key fields. This option can also be used to create trees with different lengths.
In settings.py:
DDF_FK_MIN_DEPTH = 0
In the test file:
instance = G(MyModel, fk_min_depth=1)
assert instance.self_fk.id is not None
assert instance.self_fk.self_fk.id is None
instance = G(MyModel, fk_min_depth=2)
assert instance.self_fk.id is not None
assert instance.self_fk.self_fk.id is not None
assert instance.self_fk.self_fk.self_fk.id is None
> Incompatibility warning: Before DDF 3.0.3, DDF handled FK cycles instead of FK depth, through the removed properties DDF_NUMBER_OF_LAPS and number_of_laps.