2

モデルの 1 つで一連のフィルターを実行しています。具体的には、私のビューの 1 つで次のようなことをしています。

cities = City.objects.filter(name__icontains=request.GET['name']
cities = City.objects.filter(population__gte=request.GET['lowest_population']
return cities

ここで、別のタイプのフィルターをもう 1 つ追加したいと思います。具体的には、特定の郵便番号から一定の距離にある都市のみを含めたいと考えています。私はすでにこれに関連する機能を持っています。つまり、次のようなものです。

distanceFromZipCode(city, zipCode)
# This returns 110 miles, for example

django のクエリセット フィルタリングと、追加したい追加のフィルターを組み合わせるにはどうすればよいですか? 都市が単なるリストである場合、.filter() を使用して適切なラムダを渡すことができることを知っています (たとえば、関連する郵便番号からの距離が <100 の場合は true を返します)。

しかし、単純なリストではなく、クエリ セットを扱っているので、どうすればよいでしょうか?

4

4 に答える 4

1

問題の根本は、db 内で実行される sql フィルターと、レコードが db から実体化された後に実行される python フィルターを混在させようとしていることです。データベースからアイテムを取得し、その上でフィルタリングしないと、それを行うことはできません。

Python 関数を介してこれを行うことはできませんが、geodjango を介してこれを行うことができます。

https://docs.djangoproject.com/en/dev/ref/contrib/gis/db-api/#distance-queries

cites = cities.filter(distance_lt=101)

あなたが望むものを手に入れるでしょう

于 2013-06-18T07:23:55.207 に答える
0

私の意見では、Queryset オブジェクトを使用し、カスタム マネージャー内で複雑なフィルター メソッドを定義する必要があります。

from django.db import models
from django.db.models import Q


class CityManager(models.Manager):

    def get_filtered_cities(self, name=None, lowest_population=None, zip_code=None):
        query = Q()

        if(name):
            query = Q(name__icontains=name)

        if(lowest_population):
            query = query & Q(population__gte=lowest_population)

        if(zip_code):
            pass #other query object

        return self.get_query_set().filter(query)
于 2013-06-15T10:10:11.167 に答える