Django:Prefetch_related 多重逆关系
Django: Prefetch Related multiple reverse relationships
我有以下型号:
class Animal(models.Model):
name = models.CharField(max_length=256, blank=True, null=True)
class Carnivore(models.Model):
name = models.CharField(max_length=256, blank=True, null=True)
animal = models.ForeignKey(Animal)
testing_params = models.ForeignKey(TestParams, blank=True, null=True)
class TestParams(models.Model):
params_1 = models.CharField(max_length=256, blank=True, null=True)
params_2 = models.CharField(max_length=256, blank=True, null=True)
class Metrics(models.Model):
carnivore = models.ForeignKey(Carnivore, null=True, blank=True)
现在我想为 TestParams
过滤器对象预取 carnivore
animal
、metrics
。所以我正在做以下事情:
test_params = TestParams.objects.filter(**filters)
test_params_data = test_params.prefetch_related("carnivore_set", "carnivore_set__animal", "carnivore_set__metrics_set")
但是当我遍历 test_params_data
并打印每个实例的 __dict__
.
时,我只在 _prefetched_objects_cache
参数中得到 carnivore_set
那么如何在 prefetch_related
中获得多级反向关系?
根据@Willem Van Onsem 的评论,我找到了答案。这是我实施的解决方案:
test_params_data = test_params.prefetch_related(
Prefetch("carnivore_set", queryset=Carnivore.objects.prefetch_related(
Prefetch("animal_set", to_attr="animals"),
Prefetch("metrics_set", to_attr="metrics")),
to_attr="carnivores")
)
这个解决方案对我有用。如果存在任何更好的解决方案,请随时post。
我有以下型号:
class Animal(models.Model):
name = models.CharField(max_length=256, blank=True, null=True)
class Carnivore(models.Model):
name = models.CharField(max_length=256, blank=True, null=True)
animal = models.ForeignKey(Animal)
testing_params = models.ForeignKey(TestParams, blank=True, null=True)
class TestParams(models.Model):
params_1 = models.CharField(max_length=256, blank=True, null=True)
params_2 = models.CharField(max_length=256, blank=True, null=True)
class Metrics(models.Model):
carnivore = models.ForeignKey(Carnivore, null=True, blank=True)
现在我想为 TestParams
过滤器对象预取 carnivore
animal
、metrics
。所以我正在做以下事情:
test_params = TestParams.objects.filter(**filters)
test_params_data = test_params.prefetch_related("carnivore_set", "carnivore_set__animal", "carnivore_set__metrics_set")
但是当我遍历 test_params_data
并打印每个实例的 __dict__
.
_prefetched_objects_cache
参数中得到 carnivore_set
那么如何在 prefetch_related
中获得多级反向关系?
根据@Willem Van Onsem 的评论,我找到了答案。这是我实施的解决方案:
test_params_data = test_params.prefetch_related(
Prefetch("carnivore_set", queryset=Carnivore.objects.prefetch_related(
Prefetch("animal_set", to_attr="animals"),
Prefetch("metrics_set", to_attr="metrics")),
to_attr="carnivores")
)
这个解决方案对我有用。如果存在任何更好的解决方案,请随时post。