【问题标题】:how to make a field have choices from another model in django如何使一个字段可以从 django 中的另一个模型中进行选择
【发布时间】:2021-08-13 06:29:03
【问题描述】:

我正在为我的学校项目创建一个评分查看应用程序,但我对如何建立每个模型的关系感到困惑。

我希望我的StudentGrade 模型上的subject 字段具有来自Student 模型的选项列表,但我只想显示/获取enrolled_subjectsstudent instance

模型.py:

class Subjects(models.Model):
        subject_name = models.CharField(...)
        subject_code =  ...
        ...


class Student(models.Model):
        student = models.ForeignKey(setttings.AUTH_USER_MODEL,...)
        enrolled_subjects = models.ManyToManyField(Subjects)
        ...


class StudentGrade(models.Model):
    PERIOD_CHOICES = [
        ...
    ]

    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE, limit_choices_to=Q(is_student=True))
    period = models.CharField(choices=PERIOD_CHOICES, max_length=25)
    subject = // i want this to be list of subjects that the student has enrolled
    grade = models.DecimalField(max_digits=4, decimal_places=2)


StudentGrade 模型上,我希望subject 字段基于student instanceenrolled_subjects,我该怎么做?

【问题讨论】:

  • 你必须在你的表单/序列化器中这样做
  • 那么我应该如何处理Student Model 上的subject 字段?我应该让它models.CharField()吗? @bdbd
  • 其实再看一遍,为什么不把subject放在StudentGrade里面作为一个m2m,然后从Student里面去掉呢?因此,您可以通过StudentGrade 访问学生的科目,这是有道理的,因为科目取决于年级/时期。另外,如果StudentGrade.user 是学生,您可以使用Student 作为FK 而不是settings.AUTH_USER_MODEL 对吗?
  • 我建议使用 django 表单集的最简单方法。您可以使用表单集将多个模型字段组合到视图中的单个表单中。您可以阅读有关表单集的更多信息docs.djangoproject.com/en/3.2/topics/forms/modelforms

标签: django model


【解决方案1】:

您应该在 M2M 上使用"through" 表。您的StudentGrade 模型可以充当中间表。

class Student(models.Model):
        student = models.ForeignKey(setttings.AUTH_USER_MODEL,...)
        enrolled_subjects = models.ManyToManyField(Subjects, through="StudentGrade")

class StudentGrade(models.Model):
    PERIOD_CHOICES = [
        ...
    ]

    user = models.ForeignKey("Student", on_delete=models.CASCADE)
    subject = models.ForeignKey("Subjects", on_delete=models.CASCADE)
    period = models.CharField(choices=PERIOD_CHOICES, max_length=25)
    grade = models.DecimalField(max_digits=4, decimal_places=2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多