Как получить доступ к набору объектов по обратному внешнему ключу в Django
У меня есть 2 таблицы, определенные следующим образом:
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 в values(). У вас есть много вариантов, но все зависит от того, что вы планируете делать с объектами после запроса. Метод, который наиболее близок к тому, о чем, как мне кажется, вы просите (список экземпляров Optimisation со вложенным списком OptimisationInputs), - это добавить свойство к вашей модели Optimisation, которое вычисляет список OptimisationInputs. Что-то вроде этого:
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 будет выполняться новый запрос к базе данных и создаваться новый вложенный список.
Если бы вы указали, чего вы хотите добиться с помощью этого, я бы смог дать вам ответ, более подходящий для вашего случая использования.