28

模型.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 应该是

dziens = models.ForeignKey(Tdzien)

但事实并非如此,我无法改变这一点。通常我会使用类似的东西

Tnogahist.objects.filter(dziens__dzienrok=1234)

但我不知道如何在没有外键的情况下加入和过滤这些表。

4

4 回答 4

23

据我所知,没有外键没有连接,但您可以使用两个查询:

Tnogahist.objects.filter(dziens__in=Tdzien.objects.filter(dzienrok=1234))

于 2013-10-25T12:57:24.543 回答
19

可以通过执行原始 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
于 2013-10-25T13:50:42.103 回答
7

你能做到这一点.extra吗?来自https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra

哪里/表

您可以使用 where 定义显式 SQL WHERE 子句——也许是为了执行非显式连接。您可以使用表手动将表添加到 SQL FROM 子句。

于 2014-04-02T18:22:06.940 回答
4

为了提供更多关于@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 的查询集堆栈的其余部分配合使用,例如过滤器、排除、延迟、值和切片。因此,您可能可以将它与传统的 django 查询逻辑一起插入。例如:Tnogahist.objects.filter(...).extra(...).values('id_noga')[:10]

于 2021-02-25T18:56:50.160 回答