Выполнение Django-запроса к модели, но завершение с QuerySet для ManyToManyField этой модели - PullRequest
1 голос
/ 25 марта 2011

У меня есть стороннее приложение Django (Satchmo), модель которого называется Product, и я широко использую его на своем сайте Django.

Я хочу добавить возможность поиска товаров по цвету.,Поэтому я создал новую модель под названием 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])
    )

Таким образом, я получаю QuerySet, который содержит все ProductColor объекты в этом цветовом диапазоне.Затем я мог бы создать список Product с помощью доступа к атрибуту products ManyToMany каждого атрибута ProductColor.

Что мне действительно нужно, так это действительный набор запросов Product с.Это потому, что будет другая логика, которая будет работать с этими результатами, и она должна работать с QuerySet объектом.

Итак, мой вопрос: как я могу создать QuerySet, который мне действительно нужен?И если это не удастся, есть ли эффективный способ перестроить QuerySet (желательно без повторного попадания в базу данных)?

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Вы можете использовать диапазон поиска поля :

Вы можете использовать диапазон везде, где можете МЕЖДУ в SQL - для дат, чисел и даже символы.

Ваш запрос:

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()
1 голос
/ 25 марта 2011

Если вы хотите получить набор запросов Product, вам необходимо отфильтровать объекты Product и отфильтровать по обратной связи для цвета продукта:

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

...