跳转到主要内容

Django模型实例生成器

项目描述

https://badge.fury.io/py/django-fakery.svg https://travis-ci.org/fcurella/django-fakery.svg?branch=master https://coveralls.io/repos/fcurella/django-fakery/badge.svg?branch=master&service=github

一个易于使用的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,您可以使用 fakeryfakery_shortcuts` 修复程序(需要 ``pytestpytest-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 是迭代次数,而 ffaker 实例

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 秒),直到指定的 endend 可以是一个字符串、另一个 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 天),直到指定的 endend 可以是一个字符串、另一个 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许可证下发布。

项目详情


发布历史 发布通知 | RSS源

下载文件

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

源分布

django-fakery-4.1.3.tar.gz (17.5 kB 查看哈希值

上传时间

构建分布

django_fakery-4.1.3-py2.py3-none-any.whl (17.6 kB 查看哈希值

上传时间 Python 2 Python 3

由以下机构支持