Django: запрос внешнего ключа внешнего ключа внешнего ключа

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

У меня есть модели:

Project, primary key=project_no;

  • В проекте есть модель product_config, первичный ключ=id;
    • Под каждым product_config существует модель pre_config, первичный ключ=product_id;
      • Под каждым pre_config есть список моделей sub_config, первичный ключ=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, что может запутать и привести к ошибочному принятию экземпляров модели за необработанные значения идентификаторов, и наоборот.

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