Populate fake data in django

Published: Oct 26, 2010

Задача - нагенерить N рандомных слов, которые хоть чуть-чуть похожи на настоящие слова (то есть подобие слогов). Халява на пайтоне:

>>> import random
>>> def gen_rand_strings(num):
        allchars = [chr(i) for i in range(97, 97+26)]
        vowels = ['a', 'e', 'i', 'o', 'u', 'y']
        consonants = [i for i in allchars if i not in vowels]
        ret = []
        for i in range(0, num):
            s = ''
            rr = random.randint(2, 6)
            for j in range(1, rr):
                s += random.choice(consonants)
                s += random.choice(vowels)
            ret.append(s)
        return ret
>>> gen_rand_strings(20)
['vydohefy', 'hete', 'comegihu', 'sarabo', 'tyde', 'ro', 
 'mojuletabu', 'ruridaviqy', 'my', 'tafaluhy', 'teleniwu', 
 'xixy', 'cyky', 'hypakelo', 'kicuba', 'jekiqovazu', 
 'botaveci', 'byru', 'dolizojaca']

Зачем это понадобилось, да вот захотелось набить БД фейковыми данными :) примерно так (по проекту homebudget):

>>> from homebudget.purchases import models
>>> models.PurchaseTag.objects.count()
0
>>> new_tags = gen_rand_strings(20)
>>> for tag in new_tags:
        ntag = models.PurchaseTag.objects.get_or_create(value=tag, 
            norm_value=tag, owner=usernew)
        ntag[0].save()
>>> models.PurchaseTag.objects.count()
20
>>> from datetime import date, timedelta
>>> last = date.today()
>>> dt = date(year=2010,month=05,day=1)
>>> oneday = timedelta(days=1)
>>> while (dt < last):
        rr = random.randint(3, 10)
        for i in range(0, rr):
             tag = models.PurchaseTag.objects.get(
                 value=random.choice(new_tags))
             price = random.randint(1, 100)
             purch = gen_rand_string(2)[0]
             p = models.Purchase(name=purch,quantity=1.,
                 price_for_one=price,price_total=price, 
                 purchase_date=dt, owner=usernew)
             p.save()
             p.tags.add(tag)
             p.save()
        dt += oneday

База забита фейковыми покупками за полгода, к каждой покупке привязан один из 20 новых тагов. Теперь можно спокойно тестить выборки для построения статистики. Халява как она есть.