Как получить доступ к набору объектов по обратному внешнему ключу в 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 будет выполняться новый запрос к базе данных и создаваться новый вложенный список.

Если бы вы указали, чего вы хотите добиться с помощью этого, я бы смог дать вам ответ, более подходящий для вашего случая использования.

Вернуться на верх