Как сохранить Django Logi c на сервере - PullRequest
0 голосов
/ 10 июля 2020

У меня есть несколько подключенных 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 из моих шаблонов? Это означает ужасный дизайн БД?

Спасибо.

1 Ответ

0 голосов
/ 10 июля 2020

То, что вы здесь представляете, является иерархией вашей объектной модели - в этой степени от нее невозможно избежать, если это хорошее представление реального мира, который вы моделируете.

С личной точки зрения Я бы посоветовал вам извлечь logi c в свои представления, чтобы они выполняли фильтрацию, а ваша веб-страница проходила по этому списку.

Например,

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

Таким образом, вы выделили некоторые логи c из презентации.

...