将生成器传递给django-autofixture中的field_values

0 投票
2 回答
638 浏览
提问于 2025-04-17 08:13

根据django-autofixture 的文档,我写了以下代码(为了简洁做了编辑):

    def random_state_generator(self, states=None): 
        import random
        if not states: 
            states = "waiting|email|post|einv".split('|')
        while 1: 
            yield random.choice(states)

...

   rsg = self.random_state_generator()
   self.create_test_foo(10, values={'state': rsg})

...

    field_values = dict(field_values.items() + values.items())
    foo_fixture = AutoFixture(FooClass, overwrite_defaults=True, 
                              generate_fk=generate_fk_values,
                              field_values=field_values)
    bunch_of_stuff = foo_fixture.create(foo_count)

好吧,现在我已经把数据库设置好了,过滤出一堆东西,然后我去

for foo in bunch_of_stuff: print (foo.state)

结果我没有得到预期中的随机状态字符串,而是得到了以下输出:

generator object random_state_generator at 0x242c640>

这和我根据文档的预期不太一样,具体来说:

field_values:一个字典,字典的键是模型的字段名。值可以是分配给字段的静态值,也可以是一个生成器实例,实时生成值,或者是一个不带参数的可调用对象,返回所需的值。

我到底哪里出错了?

2 个回答

0

如果你只是想要一些原始数据,可以使用下面的代码:
def create_doctor(): if Doctor.objects.all().count() == 0: import random avail_item = ['心脏', '肾脏', '肺', '耳朵', '骨头'] for i in range(10): fixture = AutoFixture(Doctor, field_values={'用户名': 'GauravTyagi', '专科': random.choice(avail_item)}) fixture.create(1) else: print '表中已经有医生了 .........))))))))))))'

1

好的,field_values 是从 autofixture.generators 这个类实例中获取的,所以我只需要做的是:生成一个州的列表;

from autofixture.generators import ChoicesGenerator
states = "waiting|email|post|einv".split('|')
rsg = ChoicesGenerator(values=states)
self.create_test_foo(10, values={'state': rsg})

这个误解是因为把 autofixture 的生成器和普通的 Python 生成器搞混了。

撰写回答