[英]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.