Обход Django моделей вниз по течению на языке шаблонов - PullRequest
0 голосов
/ 25 марта 2020

У меня есть следующие настройки модели:

class Model1(models.Model):
    val1 = models.CharField(max_length=25, blank=True)
    val2 = models.CharField(max_length=25, blank=True)
    user = models.ForeignKey('users.User', on_delete=models.PROTECT, related_name='model1')

class Model2(models.Model):
    val3 = models.BinaryField()
    model1_link = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='model2')

class Model3(models.Model):
    id = models.BigAutoField(primary_key=True)
    model2_link = models.ForeignKey(Model2, on_delete=models.CASCADE, related_name='model3')

class Model4(models.Model):
    id = models.BigAutoField(primary_key=True)
    model3_link = models.ForeignKey(Model3, on_delete=models.CASCADE, related_name='model4', null=True, default=None)
    pred = models.CharField(max_length=50)

В моем шаблоне HTML у меня есть раздел, в котором я перебираю записи из Model1 (например, val1) и хотел бы иметь возможность для каждого значение, чтобы включить поле 'pred' из Model4. В настоящее время модели 1-4 имеют последовательную связь через свои FK. Да, я знаю, что мог бы просто включить FK в Model4, связав его с Model1, но с логической точки зрения я не предпочитаю эту опцию в данный момент.

В любом случае, такое выражение не выполняет работу на моем конце:

...
{% for entry in model1_entries %}
...
    {% if user.is_superuser and entry.model2.model3.model4.count > 0 %}
        something here
    {% endif %}
...
{% endfor %}

Я полагаю, что проблема как-то связана с тем, что call model1.model2 возвращает набор всех model2, связанных с model1, но я не знаю, как выбрать один в этом выражении и пробежаться с ним по остальным моделям, прежде чем достигнуть # 4.

Есть идеи?

1 Ответ

0 голосов
/ 25 марта 2020

Я бы добавил к вашему Model1 метод что-то вроде:

class Model1(models.Model):
    val1 = models.CharField(max_length=25, blank=True)
    val2 = models.CharField(max_length=25, blank=True)
    user = models.ForeignKey('users.User', on_delete=models.PROTECT, related_name='model1')

    def get_model4_count(self):
        count = 0
        for m2 in Model2.objects.filter(model1_link=self):
            for m3 in Model3.objects.filter(model2_link=m2):
                count += Model4.objects.filter(model3_link=m3).count()
        return count

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

По крайней мере, это позволит вам написать тест / отладку о том, что ваш метод возвращает правильные данные, и позволит вам легко использовать их в вашем шаблоне.


...
{% for entry in model1_entries %}
...
    {% if user.is_superuser and entry.get_model4_count > 0 %}
        something here
    {% endif %}
...
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...