Python 使用原始SQL查询按多对一关系数筛选查询集
我正在创建一个参考资料页面,我有以下模型:Python 使用原始SQL查询按多对一关系数筛选查询集,python,mysql,sql,django,sqlite,Python,Mysql,Sql,Django,Sqlite,我正在创建一个参考资料页面,我有以下模型: 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=
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)
它们有更多的领域,但它们与这件事无关
这个参考资料页面的问题是,没有与它们建立关系的链接的标签仍然出现,我只希望下面至少有一个链接的标签出现
现在,我已经成功地通过这个queryset筛选实现了这一点:
tags = Tag.objects.all().filter(link__isnull=False).order_by("title").distinct()
在我的views.py中工作正常,我想要的已经完成了。请注意,distinct是必需的,这样它就不会返回重复的查询
我对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"
)
Django让我不用使用SQL,这让我有些烦恼。当然,这有助于提高工作效率,但我感觉像是在学习轮子上或是其他什么。是的,嗯,我的逻辑有一个缺陷。它实际上大于0,但您的想法非常适合。Django不能完全使用它,但现在我理解了它背后的逻辑,这就是我想要的。非常感谢。没问题:为什么不能和Django一起使用呢?我知道您对Django为了编写SQL而强加的训练轮的感觉。真烦人。