Django model.py中if条件使用及反向查询名冲突问题求助
问题解决步骤
1. 修复反向查询名冲突错误
错误根源是Categories继承Members后,Django会自动生成members_ptr外键字段,而你手动添加的members外键与它的反向查询名重复。直接删除Categories类中的members = models.ForeignKey(...)字段即可解决该错误。
2. 实现“计算机科学专业学生仅选特定分类”的逻辑
你当前用if Members.studiengang == "Informatik"的写法完全错误——这是在类定义阶段执行的静态代码,无法根据每个学生的专业动态调整可选分类。推荐两种可行实现方式:
方式一:在表单中动态过滤分类选项
在表单类里根据当前学生的专业,动态设置kategorien字段的可选值:
from django import forms from .models import Categories, Members class CategoriesForm(forms.ModelForm): class Meta: model = Categories fields = ['kategorien'] def __init__(self, *args, **kwargs): self.student = kwargs.pop('student', None) super().__init__(*args, **kwargs) if self.student and self.student.studiengang == "Informatik": self.fields['kategorien'].choices = [ ("Mathematik Grundlagen I", "Mathematik Grundlagen I"), ("Grundlagen der industriellen Softwaretechnik", "Grundlagen der industriellen Softwaretechnik"), ] else: # 其他专业可设置默认选项或空值 self.fields['kategorien'].choices = []
视图中使用表单时,传入当前学生对象:
def add_category(request): # 假设已登录用户关联到Members模型 student = Members.objects.get(id=request.user.id) form = CategoriesForm(student=student) # 后续表单处理逻辑
方式二:模型层用动态函数返回分类选项
定义函数动态生成choices,适配不同专业的学生:
def get_kategorien_choices(student=None): if student and student.studiengang == "Informatik": return [ ("Mathematik Grundlagen I", "Mathematik Grundlagen I"), ("Grundlagen der industriellen Softwaretechnik", "Grundlagen der industriellen Softwaretechnik"), ] # 非计算机专业的默认选项 return [] class Categories(Members): kategorien = models.CharField(max_length=200, null=True, choices=get_kategorien_choices)
注意:这种方式在Django admin后台使用时,需要自定义ModelAdmin来传递student参数,才能正常动态显示选项。
修正后的完整models.py代码
from django.db import models from datetime import date # Create your models here. class Members(models.Model): created_at = models.DateField(default=date.today, null=True) vorname = models.CharField(max_length=200, null=True) nachname = models.CharField(max_length=200, null=True) Studiengang = ( ("IT & Technik","IT & Technik"), ("Designs & Medie", "Designs & Medie"), ("Personal & Recht","Personal & Recht"), ("Informatik","Informatik") ) studiengang = models.CharField(max_length=200, null=True, choices=Studiengang) email = models.CharField(max_length=200, null=True) passwort = models.CharField(max_length=200, null=True) def __str__(self): return self.vorname class Categories(Members): kategorien = models.CharField(max_length=200, null=True) class Statistik(models.Model): fragen_insgesammt = models.IntegerField(null=True) fragen_richtig_beantwortet = models.IntegerField(null=True) fragen_falsch_beantwortet = models.IntegerField(null=True) anzahl_der_punkte = models.IntegerField(null=True) student = models.ForeignKey(Members, null=True,on_delete= models.SET_NULL)
内容的提问来源于stack exchange,提问作者user19433213
相关产品推荐
相关产品推荐

