You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django视图调用模型方法时出现NameError问题求助

解决模型实例方法调用的NameError问题

你遇到的问题根源很明确——你把Song类里的实例方法当成了全局函数直接调用,这是Python类方法调用的典型误区。

错误原因拆解

lyrics_as_list()能正常运行,是因为你通过Song的实例(models.Song.objects.get(...)返回的对象)去调用它;但sorted_strings你直接写成了全局函数的调用方式,Python会在当前全局命名空间里找这个函数,自然找不到,所以抛出name 'sorted_strings' is not defined。

快速修复方案

和调用lyrics_as_list()一样,通过你获取到的Song实例来调用sorted_strings:

# 先把实例存起来,避免重复查询
song = models.Song.objects.get(pk=self.kwargs['pk'])
lyrics_list = song.lyrics_as_list()
# 通过实例调用模型方法
lyrics_sorted = song.sorted_strings(set(lyrics_list), "ru_RU.UTF8")

更合理的优化(符合DRY与代码语义)

观察你的sorted_strings方法,它其实不需要依赖Song实例的任何属性(只用到传入的参数),这种情况下把它改成静态方法会更合适,这样不需要绑定到具体实例就能调用,逻辑也更清晰:

修改模型代码:

class Song(models.Model):
    # 你的字段定义...
    
    def lyrics_as_list(self):
        return self.lyrics_ru.split()
    
    @staticmethod
    def sorted_strings(strings, locale=None):
        if locale is None:
            return sorted(strings)
        collator = icu.Collator.createInstance(icu.Locale(locale))
        return sorted(strings, key=collator.getSortKey)

然后在视图里可以直接通过Song类调用:

lyrics_list = models.Song.objects.get(pk=self.kwargs['pk']).lyrics_as_list()
lyrics_sorted = models.Song.sorted_strings(set(lyrics_list), "ru_RU.UTF8")

这样既保持了代码的复用性(遵循DRY),又让方法的职责更明确——它是一个和俄语字符串排序相关的工具方法,归属在Song类下也符合业务逻辑。

内容的提问来源于stack exchange,提问作者MeL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:52:36