Python Django queryset不带foreignkey的联接
model.pyPython Django queryset不带foreignkey的联接,python,django,django-queryset,Python,Django,Django Queryset,model.py class Tdzien(models.Model): dziens = models.SmallIntegerField(primary_key=True, db_column='DZIENS') dzienrok = models.SmallIntegerField(unique=True, db_column='ROK') class Tnogahist(models.Model): id_noga = models.ForeignKey(Tenerg,
class Tdzien(models.Model):
dziens = models.SmallIntegerField(primary_key=True, db_column='DZIENS')
dzienrok = models.SmallIntegerField(unique=True, db_column='ROK')
class Tnogahist(models.Model):
id_noga = models.ForeignKey(Tenerg, primary_key=True, db_column='ID_ENERG')
dziens = models.SmallIntegerField(db_column='DZIENS')
我想要的是在dzienrok=1234的地方得到id_noga。我知道哲恩斯应该
dziens = models.ForeignKey(Tdzien)
但事实并非如此,我无法改变这一点。通常我会使用类似
Tnogahist.objects.filter(dziens__dzienrok=1234)
但我不知道如何在没有外键的情况下连接和筛选这些表。据我所知,没有外键的情况下没有连接,但您可以使用两个查询:
Tnogahist.objects.filter(dziens_uuin=Tdzien.objects.filter(dzienrok=1234))
可以通过执行原始sql查询来连接两个表。但在这种情况下,情况非常糟糕,所以我建议您重写models.py
您可以检查如何执行此操作
应该是这样的:
from django.db import connection
def my_custom_sql(self):
cursor = connection.cursor()
cursor.execute("select id_noga
from myapp_Tnogahist a
inner join myapp_Tdzien b on a.dziens=b.dziens
where b.dzienrok = 1234")
row = cursor.fetchone()
return row
你能用
.extra
来做这个吗?发件人:
哪里/桌子
您可以定义显式SQL WHERE子句—可能是为了执行
非显式联接-使用where。您可以手动将表添加到
SQL FROM子句是通过使用表生成的
为了提供更多关于@paul tomblin答案的上下文 值得一提的是,适用于绝大多数django用户;最好的做法是实现常规外键。Django强烈建议避免使用
extra()。但是,extra()
仍然比使用原始查询或直接使用
下面是一个使用django方法实现此目标的示例:
Tnogahist.objects.extra(
表=['myapp_tdzien'],
其中=[
‘myapp_tnogahist.dziens=myapp_tdzien.dziens’,
“myapp_tdzien.dzienrok=%s”,
],
参数=[1234],
)
与其他方法相比,使用extra()
的主要吸引力在于它可以很好地处理django的queryset堆栈的其余部分,如筛选、排除、延迟、值和切片。因此,您可以将其与传统的django查询逻辑一起插入。例如:Tnogahist.objects.filter(…).extra(…).values('id_noga')[:10]
这将对一个子查询执行一次查询。这将转换为IN
子句中的,该子句通常有大小限制。(我所熟悉的大多数数据库中大约有1000项)@DanielDubovski这不是真的@jperelli你证明了postgres没有限制,这只是一个例子。。我所说的是,这是人们需要注意的。@DanielDubovski上述内容不应该在
子句中创建基于的项,而是一个子选择,即来自Tdzien.objects.filter(dzienrok=1234)
的id列表不会首先具体化。它按照链接帖子中的答案生成SQL,这不属于
项目限制中的