[英]Filtering queryset by number of many-to-one relationships with a raw SQL query
我正在創建資源頁面,並且具有以下模型:
class Tag(models.Model):
title = models.CharField(max_length=50, blank=False, unique=True, error_messages={'unique':"THis tag already exists."})
class Link(models.Model):
title = models.CharField(max_length=100, blank=False)
tag = models.ForeignKey(Tag, on_delete=models.CASCADE, null=False, blank=False)
哪些具有更多字段,但與該問題無關。
此資源頁面的問題在於,仍在顯示沒有與它們建立聯系的鏈接的標簽,我只希望在它們下面至少有一個鏈接的標簽出現。
現在,我設法通過以下查詢集過濾來做到這一點:
tags = Tag.objects.all().filter(link__isnull=False).order_by("title").distinct()
在我的views.py中哪個工作正常,並且我想要的已經完成。 注意,“ distinct”是必需的,這樣它就不會返回重復的查詢。
我對MySQL的經驗很少,只用MySQL和PHP構建了非常簡單的應用程序。 我現在已經知道它在SQLite下如何工作,我什至不知道如何在MySQL中做到這一點。
在我的(非常非正式的)邏輯下,它將起到以下作用(請原諒我殺死這種語言):
SELECT * FROM Tags WHERE NUMBER_OF_RELATIONSHIPS IS GREATER THAN 0
我的問題實際上是如何通過原始SQL查詢(在SQLite或MySQL下)實現這一目標?
您想獲得所有具有多個關系(即鏈接)的標簽,對嗎? 如果是這樣,則可以將其用作原始SQL:
SELECT *
FROM <Tag_TableName>
WHERE <Tag_PK_Field> IN (
-- Get Tag Ids with more than one entry in Link table
SELECT <Tag_FK_Field>
FROM <Link_TableName>
HAVING COUNT(*) >= 1 -- Only return rows that have multiple entries per same tag
GROUP BY <Tag_FK_Field>
)
如果這不起作用,則可能需要將內部SELECT換行到另一個SELECT中,以過濾出帶有多個“鏈接”條目的“標簽”。
我認為Django默認將PK字段名稱設置為“ id”,因此您的實際原始查詢可能更接近於此:
SELECT *
FROM "<proj_name>_tag"
WHERE "id" IN (
SELECT "id"
FROM "<proj_name>_link"
HAVING COUNT(*) >=1
GROUP BY "id"
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.