Django-queryset join without foreignkey

093gszye  于 2023-10-21  发布在  Go
关注(0)|答案(5)|浏览(133)

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')

我想要的是得到id_noga,其中dzienrok=1234。我知道dziens应该是

dziens = models.ForeignKey(Tdzien)

但事实并非如此我无法改变通常我会用类似于

Tnogahist.objects.filter(dziens__dzienrok=1234)

但是我不知道如何连接和过滤那些没有外键的表。

kmynzznz

kmynzznz1#

据我所知,没有没有外键的连接,但你可以使用两个查询:
Tnogahist.objects.filter(dziens__in=Tdzien.objects.filter(dzienrok=1234))

5us2dqdw

5us2dqdw2#

可以通过执行原始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
oymdgrw7

oymdgrw73#

你能用.extra做这个吗?来自https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra:
其中/表
您可以使用where定义显式的SQL WHERE子句(可能是为了执行非显式连接)。可以使用表手动将表添加到SQL FROM子句。

8mmmxcuj

8mmmxcuj4#

为了给@paul-tomblin的回答提供更多的背景,
值得一提的是,对于绝大多数django用户来说;最好的行动过程是实现常规的外键。Django强烈建议避免使用extra(),并说“将此方法用作最后手段”。但是,extra()仍然优于使用Manager.raw()或直接使用django.db.connection执行自定义SQL的原始查询
下面是一个使用django的.extra()方法来实现的例子:

Tnogahist.objects.extra(
    tables = ['myapp_tdzien'],
    where = [
        'myapp_tnogahist.dziens=myapp_tdzien.dziens',
        'myapp_tdzien.dzienrok=%s',
        ],
    params = [1234],
    )

使用extra()相对于其他方法的主要吸引力在于,它可以很好地处理django的查询集堆栈的其余部分,如filter、exclude、defer、values和slicing。所以你可以把它和传统的django查询逻辑一起插入。举例来说:Tnogahist.objects.filter(...).extra(...).values('id_noga')[:10]

velaa5lx

velaa5lx5#

You could use following if you select some fields of two models without foreign key.
#import
from django.db.models import Subquery, OuterRef
from django.db.models.expressions import RawSQL

#result
dziens_result = Tdzien.objects.filter(dzienrok=1234).annotate(
                tno_dziens=Subquery(Tnogahist.objects.filter(dziens=OuterRef('dziens')).values('dziens')
                        )
                     ).values_list('dziens', 'tno_dziens', 'dzienrok','id_noga')

相关问题