首页 > 解决方案 > 根据视图中的计算字段对 django ListView 进行排序

问题描述

我想根据在我的视图中计算的(用户特定的)字段对我的模型中的列表进行排序。我知道如何使用 模型字段进行排序class Meta,但如果我想在视图中使用计算字段,我不知道该怎么做。在寻找答案时,该extra()方法已经出现,但 django 警告不要使用它,并且将来会弃用它。有没有其他方法可以实现这一目标?

我想要实现的目标:我有一个Song带有title,artistlyrics字段的模型,在我的视图中,我计算用户对每首歌曲知道多少单词,这是我想要排序的字段。所以该字段是(提取):

for song in context['song_list']:
   stat = ((len(user_word)+len(set(already_known)))/(len(set(lyrics_list_))))*100

Song模型:

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=1800)
    lyrics_gb = models.TextField(max_length=1800)

    def __str__(self):
        return self.title

    def lyrics_as_list(self):
        return self.lyrics_ru.split()

Flashcard模型:

class Flashcard(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    deck = models.ForeignKey(Deck, on_delete=models.CASCADE)
    question = models.TextField()
    answer = models.TextField()

    def __str__(self):
        return self.question

KnownWord模型(这是如果用户没有单词的抽认卡,但他/她已经知道该单词,因此也应将其视为已知单词):

class KnownWord(models.Model):
    word_is_known = models.BooleanField(default=False)
    word = models.CharField(max_length=25)
    user = models.ForeignKey(User, related_name="known_words", on_delete=models.CASCADE)
    song = models.ForeignKey(Song, on_delete=models.CASCADE)

    def __str__(self):
        return self.word

在视图中,我使用该lyrics_as_list方法获取歌词列表。我还得到了用户的抽认卡列表。我做了一些其他的计算(例如获取单词的字典形式),然后我可以看到用户已经有多少单词,这是我想要排序的。

标签: pythonpython-3.xdjangodjango-modelsdjango-views

解决方案


推荐阅读