1

サードパーティのDjangoアプリ(Satchmo)があり、このモデルはProductDjangoサイトで広く使用されています。

色で商品を検索する機能を追加したい。そこで、という新しいモデルを作成しましたProductColor。このモデルはおおよそこのように見えます...

class ProductColor(models.Model):
    products = models.ManyToManyField(Product)
    r = models.IntegerField() 
    g = models.IntegerField()
    b = models.IntegerField()
    name = models.CharField(max_length=32)

ストア商品のデータがサイトに読み込まれると、商品の色データを使用して、そのProductColorオブジェクトを指すオブジェクトが作成されますProduct。計画では、ユーザーが色の範囲を検索して商品を検索できるようにします。

このクエリをQuerySetに入れる方法がわからないようです。私はこれを作ることができます...

# If the color ranges look something like this...
r_range, g_range, b_range = ((3,130),(0,255),(0,255))

# Then my query looks like
colors_in_range = ProductColor.objects.select_related('products')
if r_range:
    colors_in_range = colors_in_range.filter(
        Q(r__gte=r_range[0])
        | Q(r__lte=r_range[1])
    )
if g_range:
    colors_in_range = colors_in_range.filter(
        Q(g__gte=g_range[0])
        | Q(g__lte=g_range[1])
    )
if b_range:
    colors_in_range = colors_in_range.filter(
        Q(b__gte=b_range[0])
        | Q(b__lte=b_range[1])
    )

ProductColorそのため、その色の範囲のすべてのオブジェクトを含むQuerySetになります。次に、各属性のManyToMany属性にProductアクセスして、のリストを作成できます。productsProductColor

私が本当に必要としているのは、Productsの有効なQuerySetです。これは、これらの結果に対して実行される他のロジックがあり、QuerySetオブジェクトを操作する必要があるためです。

だから私の質問は、私が本当に欲しいQuerySetをどのように構築できるかということです。それが失敗した場合、QuerySetを再構築する効率的な方法はありますか(できればデータベースに再度アクセスすることなく)?

4

2 に答える 2

1

Productクエリセットを取得する場合は、Productオブジェクトをフィルタリングし、製品の色の逆の関係を介してフィルタリングする必要があります。

products = Product.objects.filter(productcolor_set__r__gte=x).distinct()

于 2011-03-25T00:00:31.587 に答える
1

範囲フィールドルックアップを使用できます。

範囲は、SQLでBETWEENを使用できる場所であればどこでも使用できます。日付、数値、さらには文字にも使用できます。

あなたの質問:

r_range, g_range, b_range = ((3,130),(0,255),(0,255))

products = Product.objects.filter(productcolor_set__r__range=r_range, 
    productcolor_set__g__range=g_range,
    productcolor_set__b__range=b_range).distinct()
于 2011-03-25T00:09:50.783 に答える