У меня есть несколько подключенных 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 в моем представлении, но поскольку данные от каждого печатаются по всему документу, я не вижу, как можно выполнить logi c в моем 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 %}
Иногда я повторяю очень похожие циклы для извлечения данных в разных областях страницы.
Могу ли я как-нибудь удалить этот лог c из моих шаблонов? Это означает ужасный дизайн БД?
Спасибо.