Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python factory boy-如何创建工厂所需的数据(预生成挂钩)_Python_Django_Unit Testing_Factory_Factory Boy - Fatal编程技术网

Python factory boy-如何创建工厂所需的数据(预生成挂钩)

Python factory boy-如何创建工厂所需的数据(预生成挂钩),python,django,unit-testing,factory,factory-boy,Python,Django,Unit Testing,Factory,Factory Boy,注意:我将尝试用一个简化的场景来解释用例(您可能觉得这很奇怪) 我有两个型号(相关但没有外键): 对于以上型号,我有以下建议: # factories.py class UserFactory(factory.DjangoModelFactory): class Meta: model = User name = factory.Sequence(lambda n: "user name %d" % n) age = randint(10, 90))

注意:我将尝试用一个简化的场景来解释用例(您可能觉得这很奇怪)

我有两个型号(相关但没有外键):

对于以上型号,我有以下建议:

# factories.py
class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = User

    name = factory.Sequence(lambda n: "user name %d" % n)
    age = randint(10, 90))
    weight = randint(30, 110))

class GroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Group

    name = factory.Sequence(lambda n: "group name %d" % n)
    summary = {
        "users": [34, 66, 76],
        "age": {
            "mean": 0,
            "max": 0,
            "min": 0,
        },
        "weight": {
            "mean": 0,
            "max": 0,
            "min": 0,
        } 
    }
特殊之处在于我在group.save()上更新了group.summary字段中的JSON数据。
注意:我不想将其移动到post_保存信号,因为我想避免“双重”保存(我有创建/修订字段)

因此,当我使用GroupFactory()时,我必须让“用户”就位

我在看后代钩子,但我需要“前代钩子”


在创建GroupFactory之前是否有生成用户数据的“最佳实践”(而不是在测试用例中手动创建)?有点像“后一代钩子”但“前”?:|

尝试使用
\u create()
钩子。大概是这样的:

class GroupFactory():
    ...


    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        # Create the prerequisite data here. 
        # Use `UserFactory.create_batch(n)` if multiple instances are needed.
        user = UserFactory()

        group = model_class(*args, **kwargs)

        # Update other fields here if needed.
        group.foo = bar

        # Required operation.
        group.save()

        return group
参考:

class GroupFactory():
    ...


    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        # Create the prerequisite data here. 
        # Use `UserFactory.create_batch(n)` if multiple instances are needed.
        user = UserFactory()

        group = model_class(*args, **kwargs)

        # Update other fields here if needed.
        group.foo = bar

        # Required operation.
        group.save()

        return group