2017-11-10 20 views
2

は、私は、この二つのモデルがあります:存在する場合に戻る他、関連テーブルから1つのレコードを選択なし

class Box(models.Model): 

    class BoxImages(models.Model): 
    box=models.ForeignKey(Box) 
    img=models.ImageField() 
    cover=models.IntegerField(default=0) 

を一つだけの画像は、箱と箱のカバー画像がまったくイメージを持っていない可能性がありますになることはできません。私が今したいのは、表紙と一緒に箱のリストを得ることです。しかし、djangoは内部結合を使用し、対応する表紙イメージのみを持つボックスを持ちます。

Box.objects.filter(box_boximages__cover=1).values('id','box_label') 

ORMが使用する結合をORMで決定するのを読んでから、左結合または左外結合を強制するにはどうすればよいですか?

答えて

1

すべてのボックスを持ちたい場合は、カバー画像を持っているかどうかにかかわらず、filterをドロップしてください。このフィルターは、あなたのクエリーセットを効果的に表紙画像を持つボックスだけに縮小します。

Box.objects.select_related('box_boximages').values('id','box_label', 'box_boximages__cover') 

select_related(存在する場合)同じクエリに関連BoxImagesを取得します。クエリーセットには、BoxImagesがない場合でも、すべてのBoxオブジェクトが含まれます。

EDIT:

それは、すべての画像を返します。ボックスに5枚の写真があるので、5つのアイテムが表示されます。

はい、正しいです。 valuesはfkey関係ごとにエントリを追加します。これに対処するにはいくつかの方法があります。

(a)最も単純なのはvaluesではなく、単純にクエリーセットを反復処理して、関連するBoxImageでBoxインスタンスを使用するだけです。コードはわかりやすいでしょう。 select_relatedを使用すると、パフォーマンスが向上します。

(b)アグリゲーションを使用して、カバーするボックス画像のみを取得します。 aggregate関数を見てください。カバーイメージ(またはMax)を見つけるにはExistsと組み合わせて使用​​できます。

(c)2つのQuerySetを作成します.1つはBoxImageなしのBoxで、もう1つはBoxImage Coverを使用して関連するすべてのBoxインスタンスを取得します。それら2つを組み合わせる。

個人的には、(a)は、後でコードを読むときや他の開発者にとって、最も簡単で理解しやすいと思います。

あなたはいつもあなたは、あなたが+モデルの継承二つのモデルを使用して考えるとBOXCOVER(ボックスにOneToOneRelation)を作成することができモデルを変更する自由を持ってない-表紙画像対カバーに基づいて選択し終わるとした場合BoxImage(n:1〜Box)モデルをサポートしています。これは理解して処理するのが最も簡単です。

+0

1つの表紙画像に5つの画像がある場合、何らかの種類のフィルタを使用しないで5つの画像すべてを返してもらえませんか?私はまだ試してみましょう。 –

+0

Risadinhaありがとうございました...ただチェックしました。すべての画像を返します。ボックスに5枚の写真があるので、5つのアイテムが表示されます。 –

関連する問題