現在、Django (1.5.1) を使用するプロジェクトに取り組んでおり、Django ORM に問題があります。
以下のように実装されたモデルがあります(私は私の問題を対象としたモデルのみをリストしました):
class Download(models.Model):
"""
Represents a unit of download with many files
"""
download_id = models.IntegerField(db_index=True, primary_key=True, null=False)
name = models.CharField(max_length=1024, null=False)
ダウンロードしたファイル (ダウンロード モデルから) を他のテーブルの特定のデータと共に一覧表示するページを作成する必要がありました。そこで、データベースに SQL ビューを作成し、このビューを Django の次のモデルで使用します。
class DownloadedFiles(models.Model):
id = models.IntegerField(null=False, primary_key=True)
file_name = models.CharField(max_length=1024)
added_date = models.DateTimeField()
class Meta:
managed = False
db_table = "file_list"
私は以下を使用してそれを呼び出します:
data = DownloadedFiles.objects.all()
ビューに問題はありません。必要な結果が返されるので問題ありません。
しかし今、ビュー以外のテーブルのフィールドを使用して結果をフィルタリングしたいと考えています。たとえば、「Download」モデルの「file_name」フィールドを使用して結果をフィルタリングしたいと考えています。SQL では、これは次のようになります。
SELECT * FROM file_list
INNER JOIN download ON download.id=file_list.id
WHERE download.file_name LIKE '%something%';
次のようなORM関数を使いたかった
DownloadedFiles.objects.filter(download__file_name__contains="something").
残念ながら、'DownloadedFiles' モデル内で 'Download' モデルが不明なため (参照がないため)、Django ORM は関係を構築できません。また、JOIN を明示的に作成する方法が見つかりません。グーグルで検索するといくつかの方法がありましたが、誰も機能しません(すべて例外がスローされました):
- extra() の使用:
FieldError: Cannot resolve keyword 'download' into field. Choices are: file_name, added_date, id
. - join() の使用 ( http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/ ):
DatabaseError: column download.id does not exist
. - 他のテーブルとの関係を持つために、ビューのモデルにいくつかの外部キーを追加します: extra() と同じです。
たぶん、これらのソリューションの実装が不十分だったか、私の場合はまったく役に立たなかったのでしょう。誰かがすでにこの状況に直面しているかどうか、またその解決方法を知りたいです。
ありがとうございました