使用列表对象的Django prefetch_related

时间:2014-12-11 15:48:03

标签: django django-queryset django-1.7

另一个prefetch_related问题,打哈欠。

使用Django 1.7给出这样的模型:

class Armor(models.Model):
    name = models.CharField(max_length=32)
    defense = models.IntegerField(max_length=18)

class Weapon(models.Model):
    name = models.CharField(max_length=32)
    attack = models.IntegerField(max_length=18)

class Alignment(models.Model):
    name = models.CharField(max_length=32)

# many more attribute models

class Knight(models.model):
    name = models.CharField(max_length=32)
    strength = models.IntegerField(max_length=18)
    iq = models.IntegerField(max_length=18)
    alignment = models.ManyToManyField(Alignment)
    weapons = models.ManyToManyField(Weapon, blank=True)
    armor = models.ManyToManyField(Armor, blank=True)
    #... many more m2ms

我需要在页面上看到所有骑士,但是我真的只关心他们的盔甲,武器或对齐,如果用户选择一个或多个属性作为过滤器。

例如,如果用户在页面导航中选择“对齐”和“武器”,我想向每个骑士显示武器和对齐集。

在我看来,我有一个用户选择的所有属性类型的列表,我想将该列表传递给queryset prefetch_related()方法,即

selected_attributes = ['alignment','weapons']
Knight.objects.all().prefetch_related(selected_attributes)

但我似乎无法让它发挥作用。 我可以这样做吗?

1 个答案:

答案 0 :(得分:2)

使用*args魔法:

Knight.objects.all().prefetch_related(*selected_attributes)