簡體   English   中英

使用原始SQL查詢按多對一關系數過濾查詢集

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

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