首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Post_save域触发M2M信号

在Post_save域触发M2M信号
EN

Stack Overflow用户
提问于 2017-03-01 22:40:58
回答 1查看 63关注 0票数 0

此代码应在每次创建新对象时将项添加到索引中。它可以工作,但没有意识到正在创建M2M字段。

我相信信号不会“看到”标签(因为它是一个M2M字段)。

换言之:

  • 仅在“创建”对象时将标题字段添加到索引中。
  • 只在单击“保存”时将M2M关系添加到索引中。

这是弹性搜索的索引。

Models.py

代码语言:javascript
复制
class Item(models.Model):
    title = models.CharField("Title", max_length=10000, blank=True)
    tag = models.ManyToManyField('Tag', blank=True)

    def get_grouped_tags(self):
        tag = self.tag.order_by('taglevel')
        grouped_tags = {
            tag_level: [
                { 'name': tag_of_level.name, 'taglevel': tag_of_level.taglevel, }
                for tag_of_level in tags_of_level
            ] for tag_level, tags_of_level
            in groupby(tag, lambda tag: tag.taglevel)
        }
        return grouped_tags

    def to_search(self):
        d = {
            "tags": self.grouped_tags(),
            "title": self.title
        }
        return ItemIndex(meta={'id': self.id}, **d)

    def indexing(self):
        obj = ItemIndex(
            meta={'id': self.id},
            title=self.title,
            typeItem=self.get_typeItem_display()
        )
        obj.save()
        return obj.to_dict(include_meta=True)

def update_search(instance, **kwargs):
    instance.to_search().save()

def remove_from_search(instance, **kwargs):
    instance.to_search().delete()

post_save.connect(update_search, sender=Item)
post_save.connect(update_search, sender=Tag)
pre_delete.connect(remove_from_search, sender=Item)
pre_delete.connect(remove_from_search, sender=Tag)
m2m_changed.connect(update_search, sender=Item)

Search.py

代码语言:javascript
复制
connections.create_connection()

class ItemIndex(DocType):
    title = String()
    class Meta:
        index = 'Item-index'


def bulk_indexing():
    ItemIndex.init()
    es = Elasticsearch()
    bulk(client=es, actions=(b.indexing() for b in models.Item.objects.all().iterator()))


def _search(title):
    s = Search().filter('term', title=title.text)
    response = s.execute()
    return response
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-02 00:26:38

明白了!与m2m_changed有关。我需要创建一个“通过”方法。

唯一需要改变的是:

代码语言:javascript
复制
m2m_changed.connect(update_search, sender=Item.tag.through)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42543494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档