首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将项目添加到索引: QuerySet无属性保存

将项目添加到索引: QuerySet无属性保存
EN

Stack Overflow用户
提问于 2017-03-09 13:36:28
回答 1查看 1.4K关注 0票数 0

我正在尝试让一个字段添加到我的索引时,它发生了变化。

下面的代码正在正确更新索引,但实际模型没有更新。另外,我得到了一个回溯错误(通过底部的链接提供)。

我得到的错误是:'QuerySet' object has no attribute 'save'

我已经通过下面的链接提供了回溯。

# models.py

代码语言:javascript
复制
class Tag(models.Model):
    name = models.CharField("Name", max_length=5000, blank=True)
    taglevel = models.IntegerField("Tag level", null=True, blank=True)

    def to_search(self):
        tags = self.id
        if tags:
            queryset = Item.objects.filter(tag=tags)
            for object in queryset:
                object.save()
        return queryset

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.get_grouped_tags(),
            "title": self.title
        }
        return ItemIndex(meta={'id': self.id}, **d)

    def indexing(self):
        obj = ItemIndex(
            meta={'id': self.id},
            title=self.title,
            tag=self.get_grouped_tags(),
        )
        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.tag.through)

# search.py

代码语言:javascript
复制
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

回溯

http://dpaste.com/1FGGKBF

EN

回答 1

Stack Overflow用户

发布于 2017-03-09 16:03:52

问题是信号执行这一行

代码语言:javascript
复制
instance.to_search().save()

但是对于您的Tag模型的to_search返回查询集

代码语言:javascript
复制
def to_search(self):
    tags = self.id
    if tags:
        queryset = Item.objects.filter(tag=tags)
        for object in queryset:
            object.save()
    return queryset #  <- here

这就是为什么你会得到这个错误。您应该像处理Item模型的to_search一样返回ItemIndex,或者也可以返回self。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42687549

复制
相关文章

相似问题

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