gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:36:22 27 4
gpt4 key购买 nike

我在设计数据库时遇到了很多困难,但我将问题归结为核心问题。
学生可以注册套餐。包是许多模块的组。
当学生注册一个包时,我需要为包中的每个模块自动生成一个 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 Student 和 Module 之间的关系,“通过”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 进行查询甚至 student_module__student__id如果您没有模块 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com