| | 36 | def indexed(self, **kwargs): |
| | 37 | """ |
| | 38 | Find fossils by fossil indexes |
| | 39 | """ |
| | 40 | qs = self.get_query_set() |
| | 41 | |
| | 42 | # Find all indexes by given key and value |
| | 43 | indexeds = FossilIndexer.objects.all() |
| | 44 | for k,v in kwargs.items(): |
| | 45 | indexeds = indexeds.filter(**{'key': k, 'value': v}) |
| | 46 | |
| | 47 | pks = indexeds.distinct().values_list('fossil', flat=True) |
| | 48 | |
| | 49 | return qs.filter(pk__in=pks) |
| | 50 | |
| | 83 | class FossilIndexer(models.Model): |
| | 84 | """ |
| | 85 | Class used to index fossil by field values. This is a sollution for querying |
| | 86 | fossils withouth use search in the field 'serialized'. Of course, this is |
| | 87 | because index + join is faster than like. |
| | 88 | """ |
| | 89 | class Meta: |
| | 90 | unique_together = ( |
| | 91 | ('fossil','key','value'), |
| | 92 | ) |
| | 93 | |
| | 94 | fossil = models.ForeignKey('Fossil', related_name='indexeds') |
| | 95 | key = models.CharField(max_length=250) |
| | 96 | value = models.CharField(max_length=250) |
| | 97 | |