具有所有可能组合的 Django fixture?

Django fixture with all possible combinations?

我正在尝试测试统计功能,该功能计算我的数据库中的对象类型。为此,我想为每种可能的模型字段组合至少创建一个实例。随机测试数据需要大量的测试对象来确保满足所有可能的组合。

这是我的一个模型的简短示例:

class Member(models.Model)
    is_active = models.BooleanField()
    name = models.CharField()
    balance = models.IntegerField()
    division = models.ForeignKey(Division, on_delete=models.CASCADE)

Class Division(models.Model)
    name = models.CharField()

我现在就是这样做的 django_dynamic_fixture:

from django.test import TestCase
from django_dynamic_fixture import G
from members.models import Member

class StatisticsTestCase(TestCase):
    def setUp(self):
        for is_active in [True, False]:
            for balance in [-100, 0, 100]:
                for division in Division.objects.all()
                    G(Member, is_active=is_active, balance=balance, division=division)

但这看起来很糟糕并且难以阅读。是否有更简单易读的代码来创建对象所有可能的属性组合?

我愿意接受不同的测试数据生成器,只要它们能很好地与 Python 3 和 Django 一起工作。

import itertools

combinations = list(itertools.product(*[[True, False], [-100, 0, 100]]))
for division in Division.objects.all():
    for is_active, balance in combinations:
        G(Member, is_active=is_active, balance=balance, division=division)

更新:

import itertools

combinations = list(itertools.product([True, False], [-100, 0, 100], Division.objects.all()))
for is_active, balance, division in combinations:
    G(Member, is_active=is_active, balance=balance, division=division)

Sara 的回答向前迈出了一大步,但我对代码的可读性仍然不满意,所以我正在回答我自己的问题。

variants = {
    'is_active': [True, False],
    'balance': [-100, 0, 100],
    'division': list(Division.objects.all())
}

names = sorted(variants)
products = [dict(zip(names, prod)) for prod in it.product(*(variants[name] for name in names))]

for combination in products:
    G(Member, **combination)

现在任何想要更改此测试的人都可以轻松地看到哪个 属性 使用哪些值进行了测试。感谢转至 this 问答以获取 dict 解决方案。