我在设计数据库时遇到了很多困难,但我已将问题归结为核心问题。
学生可以注册套餐。包是许多模块的组。
当学生注册包时,我需要为包中的每个模块自动生成一个链接到学生的 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/