首页 > 解决方案 > 如何将 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)

我需要在页面上打印来自单个用户的数据。来自不同models 的数据分布在页面上,而不是组合在一起。例如:

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..

当然,我可以在我的视图中收集所有这些models,但是由于每个文件的数据都打印在整个文档中,我看不出如何在我的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 %}

有时我会重复非常相似的循环来检索页面不同区域的数据。

有什么办法可以从我的模板中删除这个逻辑?这是否表明糟糕的数据库设计?

谢谢你。

标签: djangodjango-templatesdjango-database

解决方案


您在这里代表的是您的对象模型的层次结构 - 如果这是您正在建模的现实世界的良好表示,那么就没有逃避它。

从个人角度来看,我建议您将逻辑提取到您的视图中 - 以便它们进行过滤并且您的网页会遍历该列表。

例如,

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

这样,您已经从演示文稿中分离出一些逻辑。


推荐阅读