簡體   English   中英

加入外鍵表 Django QuerySet

[英]Join Foreign Key Table Django QuerySet

I'm learning Django Queryset, but i get confused when I want to use queryset Django to join table, instead of using Django raw query I want to learn Django queryset.

就我而言,我想獲取 RiskIdentification 數據。

class Activity(models.Model):
    act_name           =  models.CharField(max_length = 40)
    created_at          =   models.DateTimeField(auto_now_add=True)
    updated_at          =   models.DateTimeField(auto_now = True)
  

class ActivityDetail(models.Model):
    act_risk_assessment = models.ForeignKey(RiskAssessment, on_delete=models.CASCADE)
    act          = models.ForeignKey(Activity, on_delete=models.CASCADE)
    created_at          = models.DateTimeField(auto_now_add=True)
    updated_at          = models.DateTimeField(auto_now = True)


class RiskAssessment(models.Model):
    name                = models.CharField(max_length = 30)
    date                = models.DateField()
    email_date          = models.DateField()
    created_at          = models.DateTimeField(auto_now_add=True)
    updated_at          = models.DateTimeField(auto_now = True)

class  RiskIdentification (models.Model):
  
    idn_description          = models.CharField(max_length = 30)
    idn_risk_assessment     = models.ForeignKey(RiskAssessment, on_delete=models.CASCADE)
    risk_type             = models.ForeignKey(RiskType, on_delete=models.CASCADE)

class RiskMitigation (models.Model):
  
    mtg_description         = models.CharField(max_length = 30)
    identification_risk     = models.ForeignKey(RiskIdentification, on_delete=models.CASCADE)

在原始查詢中看起來像這樣

SELECT  idn_description
FROM RiskAsessment RA 
JOIN RiskIdentification RI on RA.id = RI.idn_riskAsessment 
JOIN ActivityDetail AD on AD.act_risk_assessment = RA.id 
JOIN Activity A on A.id = AD.act

請幫助我 Django 查詢的外觀並描述它。

與您的 SQL 等效的查詢集是:

qs = (RiskIdentification.objects
      .exclude(idn_risk_assessment__activity_detail_set=None)
      .values('idn_description'))

通常不需要通過.values(...)來限制 output 字段。

在問題中用人類語言表達預期結果總是有用的,盡管它可能不如 SQL 或查詢集准確,但出錯或誤解的風險較小。

編寫查詢集而不是原始 SQL 的一個優點是可以通過編譯為 SQL 並讀取來驗證查詢集的正確性。 這樣可以發現很多錯誤,而原始SQL的正確性無法通過獨立的方式進行檢查:

>>> print(str(queryset.query))
SELECT ... FROM ...

我試圖從您的 SQL 中猜測您的意圖:

我想知道RiskIdentification中用於任何ActivityDetail的所有idn_description 我想多次看到它們在任何ActivityDetail中使用了多少。

(如果沒有 Activity 字段用於 output 或 WHERE 條件並且數據庫已使用完整性規則正確創建(由 Django 自動創建),則 SQL JOIN Activity A on A.id = AD.act的部分是無用的,然后丟失或無效值總是被數據庫拒絕,因為需要該外鍵。)

act_risk_assessment字段定義一個act_risk_assessment很有用,例如“activity_details”,或者現在期望它是默認名稱activity_detail_set

暫無
暫無

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

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