Django: запрос внешнего ключа внешнего ключа внешнего ключа
Это может быть глупый вопрос, и я уверен, что существует основной запрос для этой ситуации, но я, похоже, не могу разобраться с этим, и Google оказался пропуском для решения.
У меня есть модели:
Project, primary key=project_no;
- В проекте есть модель product_config, первичный ключ=id;
- Под каждым product_config существует модель pre_config, первичный ключ=product_id;
- Под каждым pre_config есть список моделей sub_config, первичный ключ=id;
- Под каждым product_config существует модель pre_config, первичный ключ=product_id;
Теперь я загружаю страницу для деталей проекта, передаю project_no и делаю запрос для всех product_configs:
project.objects.get(project_no=project_no)
product_config.objects.filter(project_no=project_no)
Теперь я хочу создать таблицу для списка sub_configs в соответствии с pre_config в product_config. В оболочке я могу запросить список с помощью:
sub_config.objects.filter(product_id=product_id)
Как я могу передать product_id из pre_config в product_config для запроса всех sub_configs?
Для вашего случая использования похоже, что вы хотите использовать API для связанных объектов.
Если я правильно понимаю ваш вопрос, вот пример:
# Of course, you should handle cases when 0 or multiple product_configs
# match the query, and replace QUERY with an actual selector.
# This is the related pre_config's product_id
my_pre_config = product_config.objects.get(QUERY).product_id
assemblies = my_pre_config.config_assembly_set.all()
(Я придерживаюсь этого стандарта для имен классов, поэтому могу ошибаться насчет _set в вашем случае. Это может быть configassembly_set.)
Затем вы можете перебирать assemblies, чтобы получить подконфигурацию каждого config_assembly, например: assembly.subconfig_id.
Кроме того, для удобства чтения я бы рекомендовал переименовать ваши поля внешних ключей с foo_id на что-то, обозначающее фактическую модель, на которую указывает внешний ключ. Например:
# models.py
class product_config(models.Model):
project = models.ForeignKey('project.project', on_delete=models.CASCADE)
Хотя значения базы данных будут идентификаторами, в вашем коде вы, вероятно, захотите ссылаться на my_product_config.project.project_no вместо my_product_config.project_no.project_no, что может запутать и привести к ошибочному принятию экземпляров модели за необработанные значения идентификаторов, и наоборот.