Django模型实例生成器
项目描述
一个易于使用的Django 创建方法 (又称对象工厂) 实现,由 Faker 支持。
django_fakery 将尝试根据字段的名称和类型猜测字段值。
安装
使用以下命令安装
$ pip install django-fakery
快速入门
from django_fakery import factory
from myapp.models import MyModel
factory.m(MyModel)(field='value')
如果您遇到循环导入问题,您还可以通过使用 M 工具函数引用模型
from django_fakery import factory, M
factory.m(M("myapp.MyModel"))(field="value")
如果您真的不想导入任何东西,您也可以使用 <app_label>.<ModelName> 语法来引用模型。这不被鼓励,因为它可能会破坏类型提示
from django_fakery import factory
factory.m("myapp.MyModel")(field="value")
如果您使用 pytest,您可以使用 fakery 和 fakery_shortcuts` 修复程序(需要 ``pytest 和 pytest-django)
import pytest
from myapp.models import MyModel
@pytest.mark.django_db
def test_mymodel(fakery, fakery_shortcuts):
fakery.m(MyModel)(field=fakery_shortcuts.future_datetime())
如果您愿意,您还可以使用更冗长的API
from django_fakery import factory
from myapp.models import MyModel
factory.make(
MyModel,
fields={
'field': 'value',
}
)
我们将通过文档使用简短API。
字段值可以是任何Python对象、可调用函数或lambda
from django.utils import timezone
from django_fakery import factory
from myapp.models import MyModel
factory.m(MyModel)(created=timezone.now)
当使用lambda时,它将接收两个参数: n 是迭代次数,而 f 是 faker 实例
from django.contrib.auth.models import User
user = factory.m(User)(
username=lambda n, f: 'user_{}'.format(n),
)
django-fakery 包含一些用于常见需求的预构建lambda。有关更多信息,请参阅 快捷方式。
您可以使用 quantity 参数创建多个对象
from django_fakery import factory
from django.contrib.auth.models import User
factory.m(User, quantity=4)
为了方便,当字段的值为字符串时,它将与迭代次数进行插值
from myapp.models import MyModel
user = factory.m(User, quantity=4)(
username='user_{}',
)
自定义字段
您可以通过添加自定义字段类和在 factory.field_types 中添加一个函数来支持自定义字段。
from django_fakery import factory
from my_fields import CustomField
def func(faker, field, count, *args, **kwargs):
return 43
factory.field_types.add(
CustomField, (func, [], {})
)
作为一个快捷方式,您可以通过名称指定任何 Faker 函数。
from django_fakery import factory
from my_fields import CustomField
factory.field_types.add(
CustomField, ("random_int", [], {"min": 0, "max": 60})
)
外键
不可为空的 ForeignKey 会自动创建相关对象。
如果您想显式创建一个相关对象,可以像传递其他任何值一样传递一个工厂。
from django.contrib.auth.models import User
from food.models import Pizza
pizza = factory.m(Pizza)(
chef=factory.m(User)(username='Gusteau'),
)
如果您不想创建相关对象并重复使用外键的相同值,可以使用特殊值 django_fakery.rels.SELECT。
from django_fakery import factory, rels
from food.models import Pizza
pizza = factory.m(Pizza, quantity=5)(
chef=rels.SELECT,
)
django-fakery 将始终使用相关模型的第一个实例,如果需要,将创建一个。
多对多
由于 ManyToManyField 是隐式可为空的(即:它们总是允许它们的 .count() 等于 0),因此那些字段上的相关对象不会为您自动创建。
如果您想显式创建相关对象,可以将列表作为字段值传递。
from food.models import Pizza, Topping
pizza = factory.m(Pizza)(
toppings=[
factory.m(Topping)(name='Anchovies')
],
)
您还可以传递一个工厂,以创建多个对象。
from food.models import Pizza, Topping
pizza = factory.m(Pizza)(
toppings=factory.m(Topping, quantity=5),
)
快捷方式
django-fakery 包含一些快捷函数来生成常用值。
future_datetime(end='+30d')
返回一个未来的 datetime 对象(即,现在后的 1 秒),直到指定的 end。 end 可以是一个字符串、另一个 datetime 或一个 timedelta。如果它是一个字符串,它必须以 + 开头,后面跟一个整数和一个单位,例如: '+30d'。默认为 '+30d'。
有效的单位有
'years', 'y'
'weeks', 'w'
'days', 'd'
'hours', 'hours'
'minutes', 'm'
'seconds', 's'
示例
from django_fakery import factory, shortcuts
from myapp.models import MyModel
factory.m(MyModel)(field=shortcuts.future_datetime('+1w'))
future_date(end='+30d')
返回一个未来的 date 对象(即,现在后的 1 天),直到指定的 end。 end 可以是一个字符串、另一个 date 或一个 timedelta。如果它是一个字符串,它必须以 + 开头,后面跟一个整数和一个单位,例如: '+30d'。默认为 '+30d'。
past_datetime(start='-30d')
返回一个过去的 datetime 对象,在 1 秒前和指定的 start 之间。 start 可以是一个字符串、另一个 datetime 或一个 timedelta。如果它是一个字符串,它必须以 - 开头,后面跟一个整数和一个单位,例如: '-30d'。默认为 '-30d'。
past_date(start='-30d')
返回一个过去的 date 对象,在 1 天前和指定的 start 之间。 start 可以是一个字符串、另一个 date 或一个 timedelta。如果它是一个字符串,它必须以 - 开头,后面跟一个整数和一个单位,例如: '-30d'。默认为 '-30d'。
懒加载
您可以通过使用 Lazy 对象来引用创建的实例的自身属性或方法。
例如,如果您想创建以用户名为电子邮件地址的用户,并使它们始终匹配,您可以这样做
from django_fakery import factory, Lazy
from django.contrib.auth.models import User
factory.m(auth.User)(
username=Lazy('email'),
)
如果您想分配实例方法返回的值,可以将方法参数传递给 Lazy 对象
from django_fakery import factory, Lazy
from myapp.models import MyModel
factory.m(MyModel)(
myfield=Lazy('model_method', 'argument', keyword='keyword value'),
)
预保存和后保存钩子
您可以定义在实例保存前或保存后要调用的函数。
from django.contrib.auth.models import User
from django_fakery import factory
factory.m(
User,
pre_save=[
lambda u: u.set_password('password')
],
)(username='username')
由于设置用户密码是一个非常常见的场景,因此我们对这种情况进行了特殊处理,因此您只需将其作为字段传递即可
from django.contrib.auth.models import User
from django_fakery import factory
factory.m(User)(
username='username',
password='password',
)
获取或创建
您可以使用 g_m(代表 get_or_make)方法来检查模型实例的存在,并在必要时创建它
from myapp.models import MyModel
myinstance, created = factory.g_m(
MyModel,
lookup={
'myfield': 'myvalue',
}
)(myotherfield='somevalue')
如果您正在寻找更明确的API,可以使用 .get_or_make() 方法
from myapp.models import MyModel
myinstance, created = factory.get_or_make(
MyModel,
lookup={
'myfield': 'myvalue',
},
fields={
'myotherfield': 'somevalue',
},
)
获取或更新
您可以使用 g_u(代表 get_or_update)方法来检查模型实例的存在,并通过它进行更新
from myapp.models import MyModel
myinstance, created = factory.g_u(
MyModel,
lookup={
'myfield': 'myvalue',
}
)(myotherfield='somevalue')
如果您正在寻找更明确的API,可以使用 .get_or_update() 方法
from myapp.models import MyModel
myinstance, created = factory.get_or_update(
MyModel,
lookup={
'myfield': 'myvalue',
},
fields={
'myotherfield': 'somevalue',
},
)
非持久实例
您可以使用 .b() 方法构建不保存到数据库的实例,就像您使用 .m() 一样
from django_fakery import factory
from myapp.models import MyModel
factory.b(MyModel)(
field='value',
)
请注意,由于实例未保存到数据库,.build() 不支持多对多关系或保存后钩子。
如果您正在寻找更明确的API,可以使用 .build() 方法
from django_fakery import factory
from myapp.models import MyModel
factory.build(
MyModel,
fields={
'field': 'value',
}
)
蓝图
使用蓝图
from django.contrib.auth.models import User
from django_fakery import factory
user = factory.blueprint(User)
user.make(quantity=10)
蓝图可以引用其他蓝图
from food.models import Pizza
pizza = factory.blueprint(Pizza).fields(
chef=user,
)
)
您还可以覆盖之前指定的字段值
from food.models import Pizza
pizza = factory.blueprint(Pizza).fields(
chef=user,
thickness=1
)
)
pizza.m(quantity=10)(thickness=2)
或者,如果您更愿意使用明确的API
from food.models import Pizza
pizza = factory.blueprint(Pizza).fields(
chef=user,
thickness=1
)
)
thicker_pizza = pizza.fields(thickness=2)
thicker_pizza.make(quantity=10)
初始化faker
from django.contrib.auth.models import User
from django_fakery import factory
factory.m(User, seed=1234, quantity=4)(
username='regularuser_{}'
)
致谢
API大量借鉴了 model_mommy。
许可证
本软件在MIT许可证下发布。
项目详情
下载文件
下载适合您平台的应用程序文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。