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

时间:2011-12-12 17:14:43

标签: python django generator

参考django-autofixture documentation,我编写了以下代码(为简洁性编辑):

    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)

而不是获得预期的随机状态字符串,我得到以下输出:

  

生成器对象random_state_generator位于0x242c640>

这不是我根据文档所期望的,特别是

  

field_values:字段名称为model的字典。值可以是分配给字段的静态值,动态生成值的Generator实例或不带参数的callable,并返回所需的值。

我做错了什么?

2 个答案:

答案 0 :(得分: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})

这种误解源于混乱的自动混合发生器与通用python发生器的混淆。

答案 1 :(得分:0)

如果你只想要一些原始数据,你可以使用:
def create_doctor(): if Doctor.objects.all().count() == 0: import random avail_item = ['Hart', 'Kidney', 'Lungs', 'Ear', 'Bones'] for i in range(10): fixture = AutoFixture(Doctor, field_values={'user_name': 'GauravTyagi', 'speciality': random.choice(avail_item)}) fixture.create(1) else: print 'Doctors exist in table .........))))))))))))'