0

我遵循了许多示例和文档,但无法做到这一点。

每当我更新模型时,我都会尝试创建我的 Elasticsearch 索引。使用“自动索引”不会记录 M2M。

  1. 当我更改其中的值时,Tag它应该更新所有Itemsis的索引

我正在使用django-elasticsearch( here ) 这是一个包装器elasticsearch-py

当我尝试connect(tag_index, sender=Tag.item.through)它时找不到标签,因为它还没有被模型导入。

这是如何正确实现的?

class Tag(models.Model):
    name = models.CharField(max_length=500, blank=True)
    taglevel = models.IntegerField(null=True, blank=True)

def tag_index(instance, **kwargs):
    Task.instance.es.do_index()

class Item(EsIndexable, models.Model):
    title = models.CharField(max_length=100, blank=True)
    tag = models.ManyToManyField('Tag', blank=True)

    class Elasticsearch(EsIndexable.Elasticsearch):
        serializer_class = TaskEsSerializer
        fields = ['title', 'tag']

@receiver(post_save, sender= Task)
def index_elastic(instance, **kwargs):
    instance.es.do_index()

m2m_changed.connect(tag_index, sender=Item.tag.through)
4

1 回答 1

0

好吧,它并不像我想象的那么“聪明”。您需要参考每个模型中的功能

class Tag(models.Model):
    name = models.CharField(max_length=500, blank=True)
    taglevel = models.IntegerField(null=True, blank=True)

@receiver(post_save, sender= Tag)
@receiver(post_delete, sender= Tag)
def index_tag(instance, **kwargs):
    Item.objects.get().es.do_index()

def tag_index(instance, **kwargs):
    instance.es.do_index()

class Item(EsIndexable, models.Model):
    title = models.CharField(max_length=100, blank=True)
    tag = models.ManyToManyField('Tag', blank=True)

    class Elasticsearch(EsIndexable.Elasticsearch):
        serializer_class = ItemEsSerializer
        fields = ['title', 'tag']

@receiver(post_save, sender= Item)
def index_elastic(instance, **kwargs):
    instance.es.do_index()
于 2017-04-19T13:32:15.600 回答