1

現在、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() と同じです。

たぶん、これらのソリューションの実装が不十分だったか、私の場合はまったく役に立たなかったのでしょう。誰かがすでにこの状況に直面しているかどうか、またその解決方法を知りたいです。

ありがとうございました

4

0 に答える 0