django - 将数据从一个表链接到另一个表,并通过中间表连接

标签 django database-design relational-database database-schema

我在设计数据库时遇到了很多困难,但我已将问题归结为核心问题。

学生可以注册套餐。包是许多模块的组。

当学生注册包时,我需要为包中的每个模块自动生成一个链接到学生的 Extra_Data 表。这将保存一个模块和一名学生独有的数据。

class Student(models.Model):
    package = models.ManyToManyField(Package, blank=True)

class Module(models.Model):
    task_type = models.CharField(max_length=200)
    topic = models.CharField(max_length=200)

class Package(models.Model):
    individual_modules = models.ManyToManyField(Module, blank=True)
    name = models.CharField(max_length=200)

如何显示包:

{% for package in user.student.module_packages.all %}
<table>
    <th>Module</th>
    <th>Task Type</th>
    <th>Topic</th>
    #<th>Complete</th> not yet implemented
    #<th>User Files</th> not yet implemented
    #<th>Teachers Files</th> not yet implemented

    <h3 class="account-heading">{{ package.name }}</h2>
    
    {% for module in package.individual_modules.all %}
    <tr>
        <td>{{ module.id }}</td>
        <td>{{ module.task_type }}</td>
        <td>{{ module.topic }}</td>
        #<td>{{ module.extra_data.module_complete }}</td> this is an example of 
        # how I would expect to be able to handle the extra_data tables contents, 
        # though its turning out to be a real challenge
    </tr>
    {% endfor %}

{% endfor %}

我尝试了很多东西,包括使用 Django through学生和模块之间的关系,“通过”Extra_Data。这不起作用,因为它直接将学生与模块链接起来 - 当在 Django Admin 中为学生提供包时,不会为包中的模块创建 Extra_Data 表。

-- 我认为这与我的主要问题无关,但学生也可以注册个别模块 --

非常感谢。

最佳答案

不如将模块和包保存在 Student 下,而是将这种关系的所有数据保存在 ExtraModuleData 下或更好的名称 StudentModule 下>。这使学生的模块历史记录与学生模型分开。

所以,就像:

# a lot of this is short-hand
class StudentModule(models.Model):
    student = ForeignKey(Student)
    module = ForeignKey(BaseModule)
    package = ForeignKey(Package, required=False)
    files = ManyToMany(StudentFile, related_name='uploads')
    completed = Boolean()

您可以列出各个模块和包,然后使用 StudentModule 的模块和包字段循环遍历它们以“选择”事件模块和包。

在 Django Admin Student 上下文中,这意味着您只需要为 StudentModule 添加内联,每一行都会提供模块和包的选择框。如果 StudentModule 不在包下,则可以有一个空的 package 字段。无需单独保存学生包数据。

对于上传和其他多对多数据,我建议将它们保存为自己的模型,如下所示。这在管理员之外更容易争论,因为您可以通过 student_module_id 进行查询,如果您没有模块 ID,甚至可以通过 student_module__student__id 进行查询。在管理中,您可以通过内联添加它们。

class StudentFile(models.Model):
    file = FileField()
    student_module = ForeignKey(StudentModule)
    ..other data

只需添加额外的上下文,您的 HTML 就可以(假设您将 st_modules = StudentModule.objects.filter(student=user) 变量传递给上下文。)

{% for sm in st_modules %}
   {{ sm.module.id }}
   {{ sm.module.task }}
   {{ sm.module.topic }}
   {% if sm.package }} {{ sm.package.name }} {% endif %}
   {% for file in sm.uploads.all }} {{ file.name }} {% endfor %}
{% endfor %}

如果您需要按包对模块进行分组,Django 模板的一个有用标签是 regroup 。您可以像这样使用它:

{% regroup st_modules by package as package_list %}
{% for package, modules in package_list %}
  {{ package.grouper }} # package name if you need it
  {% for m in modules %}
     {{ m.module.id }} # etc
  {% endfor %}

希望有帮助。

关于django - 将数据从一个表链接到另一个表,并通过中间表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62566349/

相关文章:

mysql - 左加入 Django 模型查询?

python - 通过二级模型关系进行注释

python - 应用引擎 : Structured Property vs Reference Property for one-to-many relationship

Django——在管理界面中过滤外键下拉菜单

sql - 规范化(SQL View )和性能/可行性(SQL 表)之间的权衡在哪里

mysql - 数据库设计 : how to enforce integrity

mysql - 分离多个数据库使用的查找表

mysql - 快速学习关系数据库设计有哪些好的引用资料?

python - 每个赛季篮球队/比赛/得分的数据库。表结构

Django 和 xlrd,从内存中读取