Поиск уникальных значений в django

Я начинающий пользователь Django. Мой вопрос заключается в следующем, Как я могу получить все уникальные названия категорий в search_result?

Мой models.py

class Category(models.Model):
    category_name = models.CharField(max_length=20, unique=True)
    logo = models.ImageField(upload_to='Category')
    slug = models.SlugField(unique="True")
 
    def __str__(self):
        return self.category_name



class Product(models.Model):
    product_name = models.CharField(max_length=50, blank=False)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, default="", blank=True, related_name="Products")
    price = models.FloatField(blank=False, default=0.00, validators=[MinValueValidator(0.0)], help_text='Price Can not be Less than Zero.')
 
    def __str__(self):
        return self.product_name

Мой views.py

class SearchView(TemplateView):
    template_name = "productstemplate/products.html"
 
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        user_search = self.request.GET['product']
        search_result = Product.objects.filter(Q(product_name__icontains=user_search) |
             Q(category__category_name__icontains=user_search))
 
        context['products'] = search_result

        context['categorys'] =  ===>>  Here <<===

        return context

Вы можете создать список, содержащий все значения category_name, затем отобразить его в set, а затем снова в list.

category_name_list = [e.category__category_name for e in search_result]
context['categorys'] = list(set(category_name_list))

Другим подходом может быть написание нового запроса с использованием метода distinct():

context['categorys'] = Product.objects.filter(Q(product_name__icontains=user_search) |
         Q(category__category_name__icontains=user_search)).values_list('category__category_name', flat=True).distinct()

Почему бы не создать список, содержащий значения category_name, а затем снова вывести его в список? Наш друг, который оставил этот комментарий, я также согласен, и я думаю, что ваша проблема будет полностью решена попробуйте еще раз!

Вернуться на верх