Django 将数据从一个表链接到由中间表连接的另一个表

Django 将数据从一个表链接到由中间表连接的另一个表,django,database-design,relational-database,database-schema,Django,Database Design,Relational Database,Database Schema,我在设计数据库时遇到了很多困难,但我把问题归结为核心问题 学生可以打包报名。包是由许多模块组成的组 当学生注册一个包时,我需要为包中的每个模块自动生成一个额外的_数据表,链接到学生。这将保存一个模块和一个学生独有的数据 class Student(models.Model): package = models.ManyToManyField(Package, blank=True) class Module(models.Model): task_type = models.C

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

学生可以打包报名。包是由许多模块组成的组

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

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 %}
{%用于user.student.module_packages.all%}
模块
任务类型
话题
#尚未实施的完整计划
#尚未实现的用户文件
#教师档案尚未实施
{{package.name}
{package.individual_modules.all%}
{{module.id}
{{module.task_type}
{{module.topic}}
#{{module.extra_data.module_complete}}这是
#如何处理额外的_数据表内容,
#虽然这是一个真正的挑战
{%endfor%}
{%endfor%}
我尝试过很多事情,包括在学生和模块之间使用Django关系,查看额外的数据。这不起作用,因为它直接将学生与模块联系在一起——当学生在Django Admin中获得一个包时,不会为包中的模块创建额外的_数据表

--我认为这与我的主要问题无关,但学生们也可以参加单独的模块--


非常感谢。

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

比如说:

#很多都是速记
班级学生模块(models.Model):
学生=外籍钥匙(学生)
模块=外键(基本模块)
包=外键(包,必需=假)
files=ManyToMany(StudentFile,related_name='uploads')
已完成=布尔值()
您可以列出各个模块和软件包,然后使用
StudentModule
的模块和软件包字段对它们进行循环,以“选择”活动的模块和软件包

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

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

class StudentFile(models.Model):
file=FileField()
学生模块=外键(学生模块)
…其他数据
只需添加额外的上下文,就可以创建HTML(假设您向上下文传递了
st\u modules=StudentModule.objects.filter(student=user)
变量)

如果需要按包对模块进行分组,那么Django templates有一个有用的标记。您可以这样使用:

{% 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 %}

希望有帮助。

请。给出你所需要的&把它和你的问题联系起来。仅将图像用于不能表示为文本或扩充文本的内容。无法搜索或剪切粘贴图像。包括带有图像的图例/图例和说明。使用编辑功能插入图像/链接。这很难理解,但让我试试看:当学生注册模块包时,您试图为他们拥有的每个模块自动添加额外模块数据?那么您想包括他们可以访问的文件上载吗?您好:)。这实际上阻碍了我实现您帮助我实现的最后一件事——ajax复选框。是的,你说的是对的。每个学生的每个模块都需要一个ExtraDataModule,包括单个模块和包中包含的每个模块。我最初包含了一个指向RDNM的链接,但将其删除。再次感谢。ExtraDataModule将包含特定于该学生/模块的数据。一旦我开始工作,我应该能够创建另一个与ExtraDataModule表具有一对多关系的表,这个新表将保存学生为该特定模块上传的文件。谢谢。这似乎是可行的。我将尝试现在/明天实施,并让您知道我的进展。我唯一的问题是,如果一个学生注册了一个包,我需要单独创建每个StudentModule(包包含12个模块)。是否可以在一个包中注册一名学生,而不必单独创建每个StudentModule(您不必给我代码或太多细节,您已经给我的内容非常好,我只想确保我可以做到这一点)。再次感谢:)包只是模块的容器。该关系在模块和学生之间,并为该关系提供了一些额外数据。您可以在名为
enroll\u package
的学生管理器上编写一个自定义管理器方法,该方法接受包实例,然后迭代模块,为每个模块创建新的关系。如果每个模块的额外数据不同,这将变得很麻烦,您可能需要参考StudentModule上处理额外数据的实例方法。如果额外的数据是您没有搜索/关联的数据,您可以选择使用json/文本存储。@Brenden我没有真正研究StudentModule创建的方法,但是上面的Melvyn有一个很好的解决方案。基本上可以归结为:“如果学生选择了一个包,在保存时,循环遍历包的模块并创建一个StudentModule对象”。我不知道模块的约束条件,但是如果y
{% 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 %}