django - 如何将 Django 逻辑保持在后端
问题描述
我有许多连接model
的s:
class User(models.Model):
individual_units = models.ManyToManyField(BaseUnit)
unit_packages = models.ManyToManyField(UnitPackage)
class BaseUnit(models.Model):
class UnitPackage(models.Model):
individual_units = models.ManyToManyField(BaseUnit)
class UnitFiles(models.Model):
base_unit = models.ForeignKey(BaseUnit)
lesson_number = models.CharField()
class UserUnitData(models.Model):
user = models.ForeignKey(User)
unit = models.ForeignKey(BaseUnit)
package = models.ForeignKey(UnitPackage)
class UserLessonData(models.Model):
user_unit_data = models.ForeignKey(UserUnitData)
lesson_number = models.CharField()
class UserUploadedFile(models.Model):
user_lesson_data = models.ForeignKey(UserLessonData)
我需要在页面上打印来自单个用户的数据。来自不同model
s 的数据分布在页面上,而不是组合在一起。例如:
Loop over each UnitPackage
Within each UnitPackage print each BaseUnit
Within each BaseUnit print each related UnitFiles
Then print each UserUploadedFile
After this has been done loop through every second BaseUnit
Print each BaseUnits UserLessonData
etc..
当然,我可以在我的视图中收集所有这些model
s,但是由于每个文件的数据都打印在整个文档中,我看不出如何在我的view
. 我的模板中有大量的嵌套循环:
{% for unit_data in user.unit_data.all %}
{% if unit_data.unit_id == unit.id and unit_data.package_id == package.id %}
{% for extra_data in unit_data.user_lesson_data.all %}
{% if extra_data.lesson_number|add:0 == iteration|add:1 %}
{% if extra_data.completed == True %}
<td><input type='checkbox' disabled="disabled" name='completed' checked></td>
{% else %}
<td><input type='checkbox' disabled="disabled" name='completed'></td>
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
有时我会重复非常相似的循环来检索页面不同区域的数据。
有什么办法可以从我的模板中删除这个逻辑?这是否表明糟糕的数据库设计?
谢谢你。
解决方案
您在这里代表的是您的对象模型的层次结构 - 如果这是您正在建模的现实世界的良好表示,那么就没有逃避它。
从个人角度来看,我建议您将逻辑提取到您的视图中 - 以便它们进行过滤并且您的网页会遍历该列表。
例如,
{% for unit_data in user.unit_data.all %}
{% if unit_data.unit_id == unit.id and unit_data.package_id == package.id %}
可能会变成views.py
unitdatalist = unit_data.objects.filter(unit_id = unit.id, package_id = package.id)
然后在您的模板中,您只有以下内容(假设您已通过上下文传递)
{% for unitdata in unitdatalist %}
这样,您已经从演示文稿中分离出一些逻辑。
推荐阅读
- error-handling - 如何解决 create_function 的 wordpress 站点中已弃用的问题?
- javascript - 创建动态类名,然后使用 Reactjs 递增值
- django - 计算器应用程序的统一界面
- azure-functions - Azure 函数在本地失败并出现 OutOfMemoryException
- collections - 如何在 SSJS/XPages 中循环 sessionScope?
- android - 如何使特定项目响应点击recyclerView
- excel - 根据多个条件计算excel中的唯一值
- gdb - 当前目录是否始终在 gdb 的搜索路径中
- amazon-web-services - 您可以从 AWS Batch 调用 Lambda 作业吗?
- node.js - 如何使用 discord.js 机器人 dm 用户