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

Django中Categories与Sous_Categories循环导入错误求助

解决Django模型循环导入错误及一对多关系修正

问题根源

  1. 循环导入:Categories和Sous_Categories模型互相引用,导致模块加载时未完全初始化,触发cannot import name 'Categories'错误。
  2. 关系错误:你要实现的是一对多关系(一个Categories对应多个Sous_Categories),但Categories模型里错误使用了ManyToManyField关联Sous_Categories,这会变成多对多关系,不符合需求。

解决方案

步骤1:修正模型关系

一对多关系只需要在子模型(Sous_Categories)中定义ForeignKey即可,父模型(Categories)不需要额外添加关联字段。Django会自动为父模型生成反向查询属性(默认是模型名_set,比如categories.sous_categories_set.all())。

步骤2:解决循环导入

有两种可行方案,选一种即可:

方案A:将两个模型放在同一个models.py文件中

如果原本是分开的,合并到同一文件后不需要跨文件导入,自然解决循环问题:

from django.db import models
from django.template.defaultfilters import slugify

class Categories(models.Model):
    nom_categorie = models.CharField(max_length=200)
    marchand = models.ManyToManyField('Marchands')  # 若Marchands同属当前app,用字符串引用避免潜在导入问题
    slug = models.SlugField(default='')
    images = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now=True)
    updated_at = models.DateTimeField(null=True)

class Sous_Categories(models.Model):
    nom_souscategorie = models.CharField(max_length=200)
    categorie = models.ForeignKey(Categories, on_delete=models.SET_NULL, null=True, blank=True)
    slug = models.SlugField(default='')
    images = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now=True)
    updated_at = models.DateTimeField(null=True)
方案B:使用字符串引用模型(适合模型分属不同文件的情况)

不需要直接导入模型,而是用'app名.模型名'的字符串格式引用,Django会在所有模型加载完成后解析这个引用:
修改Sous_Categories模型:

from django.db import models
from django.template.defaultfilters import slugify

class Sous_Categories(models.Model):
    nom_souscategorie = models.CharField(max_length=200)
    # 假设Categories在名为categories的app中,用字符串引用替代直接导入
    categorie = models.ForeignKey('categories.Categories', on_delete=models.SET_NULL, null=True, blank=True)
    slug = models.SlugField(default='')
    images = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now=True)
    updated_at = models.DateTimeField(null=True)

同时修改Categories模型,删除错误的ManyToManyField:

class Categories(models.Model):
    nom_categorie = models.CharField(max_length=200)
    marchand = models.ManyToManyField(Marchands)
    slug = models.SlugField(default='')
    images = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now=True)
    updated_at = models.DateTimeField(null=True)

验证

修改完成后,运行python manage.py makemigrations和python manage.py migrate更新数据库,即可正常使用模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:25:21