首页 > 解决方案 > Django - 如何创建一个包含 TextField 的每个单词的字典

问题描述

如何将 DjangoTextField转换为包含该字段中所有单词的字典?

我尝试了以下方法,但它似乎不起作用(没有错误,但在我的模板或 shell 中看不到任何内容):

def song_words():
    result = Song.objects.filter(pk=request.pk).values_list('lyrics_ru',flat=True)
    r_list =[]
    for r in result:
        r_list.append(r.split())
    return r_list

我也试过:

def get_word(self):
    dict_value = getattr(self, 'lyrics_ru_dict', None)
    if not dict_value:
        import json
        dict_value = json.loads(self.lyrics_ru)
        setattr(self, 'lyrics_ru_dict', dict_value)
    return dict_value

def set_word(self, new_lyrics_ru):
    import json
    self.lyrics_ru = json.dumps(new_lyrics_ru).encode('utf8')
    self.lyrics_ru_dict = dict(new_lyrics_ru)

word = property(get_word, set_word)

但我收到以下错误:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0). 我对 json 没有任何经验,我不知道这是否是正确的方法。

这是我的模型:

class Song(models.Model):
   title = models.CharField(max_length=25)
   artist = models.CharField(max_length=25)
   url = models.URLField()
   lyrics_ru = models.TextField(max_length=1500)
   lyrics_gb = models.TextField(max_length=1500)

   def __str__(self):
       return self.title

我的最终目标是我想将其中包含的单词与不同模型中lyrics_ru的单词(特别是)进行比较:target_word

class Word(models.Model):

    target_word = models.CharField(max_length=25)
    source_word = models.CharField(max_length=25)

问题是我不知道我是否走在正确的轨道上。因此,如果有人可以提供一些建议/链接,我将不胜感激!

标签: pythondjangodjango-modelsdjango-viewstextfield

解决方案


如果您希望歌词成为不同单词的列表,您可以简单地做的是

words = text.split() 

至于您描述的另一部分,您想要比较lyrics_ruwith的数据target_word并想要单词出现的计数(假设)。所以你能做的是

from collections import Counter
def matching_words():
    match = []
    result = Song.objects.values_list('lyrics_ru',flat=True).filter(pk=request.pk)
    target_word = Word.objects.values_list('target_word')
    for i in result:
        if i in target_word:
            match.append(i)       # list of matching words
    finaldict = Counter(match)     # make dictonary of count                        

推荐阅读