2010-01-26 1 views
0

У меня есть следующие модели ресторанов и комментариев. Я выполняю полнотекстовый поиск по некоторым полям модели Ресторана, как показано ниже в классе RestaurantIndexer. Как выполнить полный текстовый поиск, включая комментарии (т. Е. Поиск, возвращающий экземпляры Ресторана с запросом, содержащимся в одном или нескольких полях, определенных в RestaurantIndexer или в поле комментариев экземпляров Comment)?Определение индекса, объединяющего две таблицы с Djapian

********* Ресторан модель ***************

class Restaurant(models.Model): 

    name = models.CharField(max_length=100) 
    country=models.ForeignKey(Country) 
    city=models.ForeignKey(City) 
    street=models.CharField(max_length=100) 
    street_number=models.PositiveSmallIntegerField() 
    postal_code=models.PositiveIntegerField(blank=True,null=True) 
    category=models.ManyToManyField(Category, blank=True,ull=True) 
    slug = models.SlugField(unique=True) 

********* комментарий модель ** *************

class Comment(models.Model): 

    user = models.ForeignKey(User) 
    restaurant = models.ForeignKey(Restaurant) 
    submit_date = models.DateTimeField(blank = True, null = False) 
    comment = models.TextField() 

********* Ресторан индексатор ***************

class RestaurantIndexer(Indexer): 
    tags = [ 
     ('name','name'), 
     ('city','city'), 
     ('country','country'), 
     ('category', 'category'), 
     ('tag','tag') 
    ] 

#how can I add Comment.comment? 

space.add_index(Restaurant, RestaurantIndexer, attach_as='indexer') 
+0

Что вы используете для индексированного поиска? –

+0

xapian, очевидно. – stefanw

ответ

1

Djapian поддерживает точечную нотацию для разрешения полей и частей пути тегов в объявлениях Indexer. Он также поддерживает вызовы и использует их результат.

Однако, вам не нужно ничего из этого, так как вам просто нужно, чтобы получить все комментарии для ресторана, вы можете просто сделать:

class RestaurantIndexer(Indexer): 
    tags = [ 
     ('name','name'), 
     ('city','city'), 
     ('country','country.name'), 
     ('category', 'category'), 
     ('tag','tag'), 
     ('comments', 'all_comments_text'), 
    ] 

class Restaurant(models.Model): 
    # ... fields 

    @property # could also be a method, since callables work 
    def all_comments_text(self): 
     return " ".join(map(lambda x: x.comment, self.comment_set.all())) 

Обратите внимание, что это просто присоединяется все поля комментария на все соответствующие комментарии объекты с пробелом. Должно быть, для индексирования.

+0

Отлично, спасибо! – jul

+0

Спасибо, Стефан, снова питон спас мне день! –