You need to enable JavaScript to run this app. Django模型关联配置报NameError: name 'Category'未定义问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Django模型关联配置报NameError: name 'Category'未定义问题咨询

报错核心原因
  • 这是Python 顺序执行规则 引发的典型错误:当前代码把Store类的定义放在了Category类之前,当解释器逐行执行到category = models.ManyToManyField(Category)这行代码时,还没有读取到后续代码块中定义的Category类,找不到对应的类名引用,就会抛出NameError: name 'Category' is not defined的错误。
  • 这类问题不属于Django ORM的逻辑设计错误,本质是代码执行时序问题:提前运行的代码无法引用后续才声明的变量或类。
常见修复方案

Django开发场景下有两种成熟的解决方式,均可正常运行:

  • 调整类的定义顺序
    将Category类的代码块整体移动到Store类之前,让解释器先完成Category类的加载,后续在Store中编写关联字段时就能正常识别到该类。
  • 使用字符串形式引用关联模型(Django官方推荐写法)
    不需要调整两个类的定义顺序,只要把多对多字段中直接传入的类名Category替换为字符串形式的'Category'即可。Django在初始化所有模型的阶段,会自动根据这个字符串匹配对应应用下的模型类,不仅能解决代码顺序导致的名称找不到问题,还能规避后续可能出现的模型循环引用问题,适配性更强。
修复后的参考代码
from django.db import models
from datetime import datetime
# Create your models here.

class Store(models.Model):
    business_name = models.CharField(max_length=100, null=False, verbose_name='Nombre')
    nit = models.PositiveIntegerField(null=False,default=0,verbose_name='NIT')
    # 仅需将原代码中的 Category 替换为字符串形式的 'Category'
    category = models.ManyToManyField('Category')
    def __str__(self):
        return self.business_name

    class Meta:
        db_table = 'Store'
        verbose_name = 'Tienda'
        verbose_name_plural = 'Tiendas'
        ordering = ['id']

class Category(models.Model):
    name = models.CharField(max_length=150, verbose_name='Name')

    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name = 'Categoria'
        verbose_name_plural = 'Categorias'
        ordering = ['id']

内容的提问来源于stack exchange,提问作者juan francisco quiñones romero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 13:06:04