Использование prefetch_related для категории, подкатегории и функций - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь l oop над моими FeatureCatergories, FeatureSubcategories и Features. Я в состоянии l oop по моим категориям функций просто отлично. Теперь я хочу просмотреть все подкатегории и, наконец, функции. Я не уверен, что позвонить в моем шаблоне для подкатегорий .. Это должно быть {{featuresubcategory.title}}? А как насчет features?

views.py

def features_view(request):
    context = {
        "feature_categories": FeatureCategory.objects.prefetch_related('featuresubcategory_set').all(),
    }
    return render(request=request, template_name="main/features.html", context=context)

шаблона. html

{% for category in feature_categories %}
    {{category.title}}
    {% for subcategory in featuresubcategory %}
        {{ subcategory.title }}
    {% endfor %}
{% endfor %}

models.py

class FeatureCategory(models.Model):
    title = models.CharField(max_length=50)
    featured_image = models.ImageField(blank=True, upload_to="features/")
    category_slug = AutoSlugField(null=True, default=None,
                         unique=True, populate_from='title')

    class Meta:
        verbose_name_plural = "Feature Categories"

    def __str__(self):
        return self.title


class FeatureSubcategory(models.Model):
    title = models.CharField(max_length=50)
    category = models.ForeignKey('FeatureCategory', on_delete=models.CASCADE)
    category_slug = AutoSlugField(null=True, default=None,
                         unique=True, populate_from='title')

    class Meta:
        verbose_name_plural = "Feature Subcategories"

    def __str__(self):
        return self.title

class Feature(models.Model):
    title = models.CharField(max_length=150)
    category = models.ManyToManyField(FeatureSubcategory)
    description = models.TextField()
    featured_image = models.ImageField(upload_to=image_dir)

    class Meta:
        verbose_name_plural = "Features"

    def __str__(self):
        return self.title

1 Ответ

1 голос
/ 24 февраля 2020

В вашем шаблоне вы должны изменить

featuresubcategory также на category.featuresubcategory_set.all(),

использовать prefetch_related('featuresubcategory') вместо prefetch_related('featuresubcategory_set')

{% for category in feature_categories %}
{{category.title}}
    {% for subcategory in category.featuresubcategory_set.all %}
        {{ subcategory.title }}

    {% endfor %}
{% endfor %}
  • Для функций подкатегории добавьте related_name в поле вашей категории

category = models.ManyToManyField(FeatureSubcategory,related_name='subcategory_features')

и теперь вы можете использовать его в своем шаблоне, и не забудьте выполнить миграцию

 {% for category in feature_categories %}
    {{category.title}}
    {% for subcategory in category.featuresubcategory_set.all %}
        {{ subcategory.title }}
         {% for feature in subcategory.subcategory_features.all %}
              {{feature.title}}
        {% endfor %}


    {% endfor %}
{% endfor %}

Вы можете увидеть ссылку на связанный объект здесь

...