2017-12-17 8 views
1

モデルプロパティをDjangoのクエリーセットにプリフェッチしたいと思います。方法はありますか?Djangoクエリーセットで@propertyをプリフェッチするには?

class Place(models.Model): 
    name = models.CharField(max_length=200, blank=True) 
    @property 
    def bestpicurl(self): 
     try: 
      return self.placebestpic.picture.file.url 
     except: 
      return None 

class PlaceBestPic(models.Model): 
    place = models.OneToOneField(Place) 
    picture = models.ForeignKey(Picture, on_delete=models.CASCADE) 

class Picture(models.Model): 
    file = ImageField(max_length=500, upload_to="/images/") 

私のようなもの必要があるでしょう:

qs = Place.objects.all().select_related('bestpicurl') 

任意の手掛かりがどのようにそれを行うためにここに

は3つのモデルありますか? ありがとう!

答えて

1

prefetch_relatedおよびselect_relatedは、データベースクエリにコンパイルされる命令です。あなたのデータベースがそれらについて知ることができないので、純粋なPythonプロパティの名前を渡すことはできません。あなたは選択する必要があります/プリフェッチのデータベースフィールド/プロパティは、ボンネットの下に使用している関係:あなたは以下の通りですにもかかわらず

for p in qs: 
    # do stuff with p.bestpicurl 

:DBにヒットしませんプロパティを呼び出すと、今

qs = Place.objects.select_related('placebestpic') 

ここでは逆の関係で、prefetch_relatedは使用しません。 select_related docsから:

またselect_relatedに渡されたフィールドのリストにOneToOneFieldの逆方向に参照することができます - つまり、あなたが戻ってフィールドが定義されているオブジェクトへのOneToOneFieldを横切ることができます。フィールド名を指定する代わりに、関連オブジェクトのフィールドにrelated_nameを使用します。

+0

ありがとう、クリスタルクリア! –

関連する問題