我有两个这样定义的表:
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
没有像 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 属性都会导致对数据库的新查询和新的嵌套列表。
如果您想包含您想要实现的目标,我也许可以给您一个更适合您的用例的答案。