2017-01-20 9 views
0

私のクラス(MapArea)にrange testのクエリを実行しようとしていますが、NameError: name 'MapArea' is not definedというモデルでオブジェクトの可視性を把握していないようです。次のようにモデル内の範囲のフィルタクエリ

私のクラスには、次のとおりです。MapArea.objects.filter(lat__range=[self.lat - 2, self.lat + 2], lon__range=[self.lon - 2, self.lon + 2])nearby_streetsを設定

class MapArea(models.Model): 

    lat = models.DecimalField(max_digits=15,decimal_places=6) 
    lon = models.DecimalField(max_digits=15,decimal_places=6) 
    nearby_streets = MapArea.objects.filter(lat__range=[self.lat - 2, self.lat + 2], lon__range=[self.lon - 2, self.lon + 2]) 

    # Meta 
    class Meta: 
     abstract = True 

NameError: name 'MapArea' is not definedを引き起こすものです。

MapAreaはaccording to other answersと定義されているようですが、正しくアクセスしていないようです。レンジテスト機能を使用するには、どうすればMapArea.objects.filter()にアクセスできますか?

ありがとうございます。

答えて

2

このような動作のモデルフィールドを使用することはできません。すべてのモデルフィールドはデータベースに保存されますが、nearby_streetsはクエリのように見えるので、メソッドやプロパティとしては優れています。

あなたはこの

class MapArea(models.Model): 

    lat = models.DecimalField(max_digits=15,decimal_places=6) 
    lon = models.DecimalField(max_digits=15,decimal_places=6) 

    # Meta 
    class Meta: 
     abstract = True 

    @property 
    nearby_streets = MapArea.objects.filter(lat__range=[self.lat - 2, self.lat + 2], lon__range=[self.lon - 2, self.lon + 2]) 

ような何かを行うことができますし、コードの残りの部分であなただけのメソッドのような性質が、あることに注意してください、このようなmap_area.nearby_streets

としてMapAreaの任意のインスタンスからアクセスでき

彼らが呼び出されるたびに計算されるので、nearby_streetsを2回呼び出すと、データベースに2回ヒットします...

cached_propertyをプロパティの代わりに使用すると、データベースが1回だけヒットします。

関連する問題