@Wiki-fan
Я только учусь

Как сделать поиск по тегам?

Добрый день.
Есть такая моделька:
class Picture(models.Model):
	ID = models.AutoField(primary_key=True)
        ...
	tags = models.BinaryField(max_length=1000)
	class Meta:
		ordering = ["ID"]

В tags я храню set:
s = set([i for i in request.POST['tags'].split(' ')])
instance.tags = cPickle.dumps(s, protocol=cPickle.HIGHEST_PROTOCOL)
instance.save()

Проверка, есть ли элемент в set'е, вроде бы O(log n), поэтому я и заморачиваюсь с pickle.
Вопрос: нормально ли это? Есть ли лучший способ?
Вопрос 2: как организовать теперь поиск я представляю. Но как организовать выдачу результатов? Какой-нибудь
s = set([i for i in request.POST['search_query'].split(' ')])
picture_list = [for i in Picture.objects.all() if cPickle.loads(i.tags).issuperset(s)]
context_dict = {'pictures' : picture_list}

?
  • Вопрос задан
  • 1595 просмотров
Пригласить эксперта
Ответы на вопрос 2
un1t
@un1t
Это жесть, так делать нельзя.
Вообще много спопособов есть, но самый простой и правильный в твоем случае заюзать готовую библиотеку
https://github.com/alex/django-taggit
Ответ написан
Ещё один способ, если у вас PostgreSQL - использовать поле типа Array, где можно хранить список строк (тегов). Django ORM позволит искать по этим тегам. Django-select2 - удобный виджет, который сочетается и работает с упомянутым полем.
Ответ написан
Ваш ответ на вопрос

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

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