Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django queryset不带foreignkey的联接_Python_Django_Django Queryset - Fatal编程技术网

Python Django queryset不带foreignkey的联接

Python 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,

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, 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,这不属于
项目限制中的