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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:05:26