如何在 Django 中以反向外键访问对象集

问题描述 投票:0回答:1

我有两个这样定义的表:

class Optimization(BaseModel):
    name = models.TextField(unique=True, null=False)
    is_active = models.BooleanField(null=False, default=True)
    class Meta:
        db_table = 'optimization'


class OptimizationInput(BaseModel):
    name = models.TextField(null=False)
    optimization = models.ForeignKey(Optimization, null=False, on_delete=models.CASCADE)

    class Meta:
        db_table = 'optimization_input'

我想根据他们的意见进行一些优化。 我不知道如何访问 OptimizationInputs 集

我正在尝试这样做:

optimizations = Optimization.objects.filter(is_active=True).only('name').values('name', 'optimizationinputs_set')

但我也尝试过这个

optimizations = Optimization.objects.filter(is_active=True).first()
print('inputs', optimizations.optimizationinputs_set)

不管怎样,它告诉我不存在这样的属性

optimizationinputs_set

django django-models foreign-keys
1个回答
0
投票

没有像 SQL 中那样合理的方法来构造嵌套对象。当您将 optimizationinput_set 放入 value() 中时,这本质上就是您想要做的事情。您有很多选择,但这取决于您在查询对象后计划如何处理这些对象。最接近我认为您所要求的方法(带有 OptimizationInputs 嵌套列表的 Optimization 实例列表)的方法是将一个属性添加到您的 Optimization 模型中,以计算 OptimizationInputs 列表。像这样的东西:

class Optimization(BaseModel):
    name = models.TextField(unique=True, null=False)
    is_active = models.BooleanField(null=False, default=True)

    class Meta:
        db_table = 'optimization'

    @property
    def optimization_input_list(self):
        return list(self.optimizationinput_set.all())


class OptimizationInput(BaseModel):
    name = models.TextField(null=False)
    optimization = models.ForeignKey(Optimization, null=False, on_delete=models.CASCADE)

    class Meta:
        db_table = 'optimization_input'

那么你可以做

optimizations = list(Optimization.objects.filter(is_active=True))

此列表中的每个优化都可以访问 optimization.optimization_input_list,它将是 OptimizationInput 实例的嵌套列表。请记住,每次调用 optimization_input_list 属性都会导致对数据库的新查询和新的嵌套列表。

如果您想包含您想要实现的目标,我也许可以给您一个更适合您的用例的答案。

© www.soinside.com 2019 - 2024. All rights reserved.