【已解决】[drf

[复制链接]
查看11 | 回复2 | 2021-1-27 06:08:46 | 显示全部楼层 |阅读模式
本项目采用的django的drf框架
因项目本身需求,现打算将News,消息等东西存入es里,采用es,mysql混用的模式
es方便的json格式吸引了我,故打算将之前的数据库模型
./models.py
classNews(models.Model):
"""
新闻类
"""
title=models.CharField(max_length=256,verbose_name="标题")
level=models.ForeignKey(Level,verbose_name="所属分级",on_delete=models.SET_NULL,null=True,blank=True)
content=models.TextField(verbose_name="内容")
author=models.ForeignKey(User,verbose_name="作者",on_delete=models.SET_NULL,null=True,blank=True)
cancomment=models.IntegerField(verbose_name="是否能被评论",choices=CAN_CHOICES,default=1)
create_date=models.DateTimeField(verbose_name="创建时间",auto_now_add=True)
watch_count=models.IntegerField(verbose_name="浏览量",default=0)
pass
classNewsPicsUri(models.Model):
"""
新闻图片附件地址类
"""
path=models.CharField(verbose_name="新闻图片路径",max_length=255)
parent=models.ForeignKey(News,verbose_name="所属新闻",on_delete=models.CASCADE)
pass
在es里存成类似以下结构
{
"title":"xxx",
"content":"xxxx",
.......
"pics":[
{"path":"xxxx"},
{"path":"xxxx"},
],
.......
}
除了要为News模型创建索引之外还要怎么做呢?把NewsPicsUri也创建索引吗?
./news_index.py
classNewsIndex(indexes.SearchIndex,indexes.Indexable):
#必须的字段
text=indexes.CharField(document=True,use_template=True)
#必须重载的返回的模型
defget_model(self):
returnNews
#必须重载的返回的查询集
defindex_queryset(self,using=None):
returnself.get_model().objects.all()
pass

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:08:46 | 显示全部楼层
自己解决了。
索引类里添加
pics=indexes.MultiValueField()
这种多值字段
然后自定义函数,以prepare_开头,后面跟字段名
#自定义pics字段。必须是这种列表的JSON格式
defprepare_pics(self,obj):
return[{"path":pic.path}forpicinobj.newspicsuri_set.all()]

要注意该index文件名为search_indexes.py,不能错,不然rebuild_index时无效。
回复

使用道具 举报

千问 | 2021-1-27 06:08:46 | 显示全部楼层
再次编辑………………
上述{"path":pic.path}在es7.x版本是可以的,当我降级到es2.x版本之后不允许了,pics里只能存正常列表,不能是列表嵌套json,故2.x版本改为
#自定义pics字段。必须是这种列表的JSON格式
defprepare_pics(self,obj):
return[pic.pathforpicinobj.newspicsuri_set.all()]
对应的django里的elasticsearch库也要降级为2.x版本
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行