Django将etudiant实例加入Group时报无et_set属性错误如何解决
问题分析
你代码里共有3处明确的错误:
- 第一处:
Group.objects.get(name="etudiant")返回的是单个Group实例,不是查询集,不需要也不能用group[0]访问,直接用group即可。 - 第二处核心错误:你的自定义
etudiant模型和Django自带的Group模型没有建立任何关联关系,Django不会自动生成反向关联的et_set属性,所以调用这个属性必然报错。 - 第三处逻辑错误:Django的
Group权限组原生设计是和自带的User用户模型绑定的,你如果要给学生分配用户组,优先要做的是让etudiant模型和User体系打通,而不是直接尝试把自定义模型实例加到Group里。
修复方案
方案1:直接在etudiant和Group之间建立多对多关联
适合不需要用Django自带的权限、登录体系的场景:
- 修改
Models.py,新增关联字段
from django.contrib.auth.models import Group class etudiant(models.Model): # 原有字段保持不变 identifiant = models.CharField(primary_key=True,max_length=20) nom = models.CharField(max_length=20) prenom = models.CharField(max_length=20) date_naissance = models.DateField(blank=True,null=True) photo = models.ImageField(upload_to=None, height_field=None, width_field=None, max_length=100,blank=True,null=True) adresse = models.CharField(max_length=50) email = models.EmailField(max_length=50,null=True,blank=True) état = models.CharField(max_length=20) situation = models.CharField(max_length=20) password = models.CharField(max_length=20) # 新增和Group的多对多关联,指定反向关联名 groups = models.ManyToManyField(Group, related_name="etudiant_set")
- 执行数据库迁移
python manage.py makemigrations python manage.py migrate
- 修改
Views.py里的报错行
group = Group.objects.get(name="etudiant") # 去掉错误的[0]索引,用自定义的反向关联名添加 group.etudiant_set.add(et) # 也可以直接从学生侧添加:et.groups.add(group)
方案2:对接Django自带用户体系(推荐)
符合Django原生设计,后续可以直接用自带的登录、权限校验能力:
- 修改
Models.py,让etudiant继承AbstractUser
from django.contrib.auth.models import AbstractUser class etudiant(AbstractUser): # 去掉原有代码里的password、email字段,AbstractUser已经自带 identifiant = models.CharField(primary_key=True,max_length=20) nom = models.CharField(max_length=20) prenom = models.CharField(max_length=20) date_naissance = models.DateField(blank=True,null=True) photo = models.ImageField(upload_to=None, height_field=None, width_field=None, max_length=100,blank=True,null=True) adresse = models.CharField(max_length=50) état = models.CharField(max_length=20) situation = models.CharField(max_length=20)
- 在项目
settings.py中添加配置,指定自定义用户模型
AUTH_USER_MODEL = "你的应用名称.etudiant"
- 执行数据库迁移后,修改
Views.py报错行
et = form.save() et.save() group = Group.objects.get(name="etudiant") # 直接调用AbstractUser自带的groups字段添加用户组 et.groups.add(group)
内容的提问来源于stack exchange,提问作者Ahmed Ennaifer
相关产品推荐
相关产品推荐

