簡體   English   中英

Django:查詢外鍵的外鍵

[英]Django: query of a foreign key of a foreign key

這可能是一個愚蠢的問題,我確信對於這種情況有一個基本的查詢,但我似乎沒有掌握它,谷歌原來是一個解決方案的錯過。

我有模型:

項目,主鍵=project_no;

  • 項目下有product_config模型,主鍵=id;
    • 每個product_config下都有一個pre_config模型,primary key=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)

現在我想根據product_config下的pre_config為sub_configs列表創建一個表。 在 shell 中,我可以使用以下命令查詢列表:

config_assembly.objects.filter(product_id=product_id)

如何從我的 product_config 傳遞 pre_config 的 product_id 來查詢所有 sub_configs?

編輯:

這是我的模型的基本結構。

in project.models

class project(models.Model):
    project_no = IntegerField('project no', primary_key=True)

class product_config(models.Model):
    project_no = models.ForeignKey('project.project', on_delete=models.CASCADE, verbose_name='project no')
    product_id = models.ForeignKey('product.pre_config', on_delete=models.CASCADE, verbose_name='product code')



in product.models

class pre_config(models.Model):
    product_id = models.CharField('product code', max_length=30, unique=True, primary_key=True)

class sub_config(models.Model):
    subproduct_id = models.CharField('subproduct code', max_length=20, unique=True, primary_key=True)



in assembly.models

class config_assembly(models.Model):
    product_id = models.ForeignKey('product.pre_config', on_delete=models.CASCADE, verbose_name='product code')
    subconfig_id = models.ForeignKey('product.sub_config', on_delete=models.CASCADE, verbose_name='subproduct code')


對於您的用例,聽起來您想將 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)

即使數據庫值將是 ID,在您的代碼中,您可能希望引用my_product_config.project.project_no而不是my_product_config.project_no.project_no ,這可能會導致混淆並導致將模型實例誤認為是原始 ID 值,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM