Сопутствующие товары - PullRequest
0 голосов
/ 02 марта 2020

В моей модели у меня есть ManyToManyField для выбора сопутствующих товаров. Мне интересно, что было бы лучшим способом представить их в моем виде и отобразить их в моем шаблоне.

models.py

class Product(models.Model): 
    title = models.CharField(max_length=80)
    category = models.ManyToManyField(ProductCategory)
    featured_image = models.ImageField(upload_to=image_dir)
    about_this_product = models.TextField()
    standard_features = models.TextField(null=True)
    featured = models.BooleanField(default=False)
    related_models = models.ManyToManyField("self", blank=True, null=True)
    model_slug = AutoSlugField(null=True, default=None,
                         unique=True, populate_from='title')

    class Meta:
        verbose_name_plural = "Products"

    def __str__(self):
        return self.title

views.py

def model_detail_view(request, category_slug, model_slug):
    product_model = get_object_or_404(Product, model_slug=model_slug) 
    context = {
        "title": "Products | %s" % product_model.title,
        "product": product_model,
    }
    return render(request=request, template_name='main/product_model_detail.html', context=context)

1 Ответ

1 голос
/ 02 марта 2020

Вы можете использовать .prefetch_related(..) точно так же, как и для любого отношения один ко многим в представлении:

def my_view(request):
    products = Product.objects<b>.prefetch_related('related_models')</b>
    return render(request, 'some_template.html', {'products': products})

Затем в шаблоне вы можете перебирать коллекцию .related_models:

{% for product in products %}
    {{ product.title }}
    related:
    {% for rel in product<b>.related_models.all</b> %}
        {{ rel.title }}
    {% endfor %}
{% endfor %}
...