models.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from __future__ import absolute_import, unicode_literals
  2. from django.db import models
  3. from taggit.managers import TaggableManager
  4. from wagtail.wagtailsearch import index
  5. class SearchTest(index.Indexed, models.Model):
  6. title = models.CharField(max_length=255)
  7. content = models.TextField()
  8. live = models.BooleanField(default=False)
  9. published_date = models.DateField(null=True)
  10. tags = TaggableManager()
  11. search_fields = [
  12. index.SearchField('title', partial_match=True),
  13. index.RelatedFields('tags', [
  14. index.SearchField('name', partial_match=True),
  15. index.FilterField('slug'),
  16. ]),
  17. index.SearchField('content'),
  18. index.SearchField('callable_indexed_field'),
  19. index.FilterField('title'),
  20. index.FilterField('live'),
  21. index.FilterField('published_date'),
  22. ]
  23. def callable_indexed_field(self):
  24. return "Callable"
  25. @classmethod
  26. def get_indexed_objects(cls):
  27. indexed_objects = super(SearchTest, cls).get_indexed_objects()
  28. # Exclude SearchTests that have a SearchTestChild to stop update_index creating duplicates
  29. if cls is SearchTest:
  30. indexed_objects = indexed_objects.exclude(
  31. id__in=SearchTestChild.objects.all().values_list('searchtest_ptr_id', flat=True)
  32. )
  33. # Exclude SearchTests that have the title "Don't index me!"
  34. indexed_objects = indexed_objects.exclude(title="Don't index me!")
  35. return indexed_objects
  36. def get_indexed_instance(self):
  37. # Check if there is a SearchTestChild that descends from this
  38. child = SearchTestChild.objects.filter(searchtest_ptr_id=self.id).first()
  39. # Return the child if there is one, otherwise return self
  40. return child or self
  41. def __str__(self):
  42. return self.title
  43. class SearchTestChild(SearchTest):
  44. subtitle = models.CharField(max_length=255, null=True, blank=True)
  45. extra_content = models.TextField()
  46. page = models.ForeignKey('wagtailcore.Page', null=True, blank=True, on_delete=models.SET_NULL)
  47. search_fields = SearchTest.search_fields + [
  48. index.SearchField('subtitle', partial_match=True),
  49. index.SearchField('extra_content'),
  50. index.RelatedFields('page', [
  51. index.SearchField('title', partial_match=True),
  52. index.SearchField('search_description'),
  53. index.FilterField('live'),
  54. ]),
  55. ]
  56. class AnotherSearchTestChild(SearchTest):
  57. # Checks that having the same field name in two child models with different
  58. # search configuration doesn't give an error
  59. subtitle = models.CharField(max_length=255, null=True, blank=True)
  60. search_fields = SearchTest.search_fields + [
  61. index.SearchField('subtitle', boost=10),
  62. ]