@frilix
Иногда "творю"

Фильтр по атрибутам Django?

Доброго времени суток. Есть модели которые реализуют атрибуты у товара.

class CategoryAttribute(CreationModificationDateMixin):
    category = TreeForeignKey(
        'category.Category',
        verbose_name='Категория для атрибута',
        on_delete=models.CASCADE,
    )

    name = models.CharField(
        'Название атрибута',
        max_length=100
    )

    slug = models.SlugField(
        'Название в URL'
    )

    class Meta:
        verbose_name = 'Атрибут категории'
        verbose_name_plural = 'Атрибуты категории'

    def __str__(self):
        return '{name}: {category}'.format(name=self.name, category=self.category.name)


class ProductAttribute(models.Model):
    category_attribute = models.ForeignKey(
        CategoryAttribute,
        verbose_name='Атрибут категории',
        on_delete=models.CASCADE,
    )

    product = models.ForeignKey(
        'products.Product',
        on_delete=models.CASCADE,
        verbose_name='Товар',
        related_name='attributes'
    )

    value = models.CharField(
        'Значение атрибута',
        max_length=250,
        blank=True
    )

    def __str__(self):
        return self.value

    class Meta:
        verbose_name = 'Атрибут продукта'
        verbose_name_plural = 'Атрибуты продукта'


Все просто, у определенной категории определенные атрибуты, а само значение заполняется для определенного товара. Вопрос в том, как мне отфильтровать товары, к примеру, которые содержат определенное значение (размер: 12 см) и тд. Я понимаю, что можно было создать что-то наподобие уже предопределенного выбора, но данный подход нерентабильный когда разброс значений слишком большой.

Что реализовано на данный момент:

urls.py

url(r'^attribute/(?P<id>[-\w]+)-(?P<category_id>[-\w]+)/$', views.AttributeProducts.as_view(), name='filter'),


views.py

...
self.attribute = get_object_or_404(ProductAttribute, pk=self.kwargs.get('id'))
self.category = get_object_or_404(Category, pk=self.kwargs.get('category_id'))

return Product.with_image.filter(attributes__value__icontains=self.attribute.value, category=self.category.id).order_by(sort_by)


Все работает и фильтрует, но возникает проблема со стороны SEO. Так как для каждого товара нужно задавать атрибут, то получается, что атрибут: 2222-11 и 21221-11(например) могут быть одинаковыми, соотвественно в индексе может получится много ненужных ссылок.

Какие я вижу варианты:

1) Закрыть от индексации данные ссылки и оставить так, чтоб работала система
2) Написать свой преобразователь типа slugify и декодер для него, таким образом значение пробрасывать через url

Есть ли еще варианты решения данной проблемы?
  • Вопрос задан
  • 701 просмотр
Пригласить эксперта
Ответы на вопрос 1
@NaName
По этой ссылке посмотрите, может будет чтото полезное (типа gte, lte) https://docs.djangoproject.com/en/1.11/ref/models/...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы