web-dev-qa-db-ja.com

Django-外部キーなしのクエリセット結合

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がすべきであることを知っています

dziens = models.ForeignKey(Tdzien)

しかし、そうではなく、私はそれを変えることはできません。通常、私は次のようなものを使用します

Tnogahist.objects.filter(dziens__dzienrok=1234)

しかし、外部キーなしでこれらのテーブルを結合してフィルタリングする方法がわかりません。

15
luzik

未加工のSQLクエリを実行して、2つのテーブルを結合することができます。しかし、この場合はかなり厄介なので、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
11
Lucas

私の知る限り、外部キーなしの結合はありませんが、2つのクエリを使用できます。

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

12
RemcoGerlich

.extraでこれを行うことができますか?差出人 https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra

ここで/テーブル

Whereを使用すると、明示的なSQL WHERE句を定義できます(おそらく、非明示的な結合を実行するため)。テーブルを使用して、SQL FROM句にテーブルを手動で追加できます。

5
Paul Tomblin