本專案采用的django的drf框架
因專案本身需求,現打算將News,訊息等東西存入es里,采用es,mysql混用的模式
es方便的json格式吸引了我,故打算將之前的資料庫模型
./models.py
class News(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
class NewsPicsUri(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
class NewsIndex(indexes.SearchIndex,indexes.Indexable):
# 必須的欄位
text = indexes.CharField(document=True,use_template=True)
# 必須多載的回傳的模型
def get_model(self):
return News
# 必須多載的回傳的查詢集
def index_queryset(self, using=None):
return self.get_model().objects.all()
pass
uj5u.com熱心網友回復:
自己解決了。索引類里添加
pics = indexes.MultiValueField()
這種多值欄位
然后自定義函式,以prepare_開頭,后面跟欄位名
# 自定義pics欄位。必須是這種串列的JSON格式
def prepare_pics(self, obj):
return [{"path":pic.path} for pic in obj.newspicsuri_set.all()]
要注意該index檔案名為search_indexes.py,不能錯,不然rebuild_index時無效。
uj5u.com熱心網友回復:
再次編輯………………上述
{"path":pic.path}在es7.x版本是可以的,當我降級到es2.x版本之后不允許了,pics里只能存正常串列,不能是串列嵌套json,故2.x版本改為
# 自定義pics欄位。必須是這種串列的JSON格式
def prepare_pics(self, obj):
return [pic.path for pic in obj.newspicsuri_set.all()]
對應的django里的elasticsearch庫也要降級為2.x版本
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/51228.html
上一篇:win10破解LoadRunner11輸入序列號AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB時總是報錯如何解決
