почему prefetch_related не работает в django? - PullRequest
1 голос
/ 22 февраля 2020

У меня есть эти модели

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    product_name = models.CharField(max_length=255, null = False, unique=True)
    product_title = models.CharField(max_length=255, null = True)
    product_price = models.CharField(max_length = 255)
    brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True)
    product_type = models.ForeignKey(Product_type, on_delete=models.SET_NULL, null=True)

class Product_feature(models.Model):
    product_feature_id = models.AutoField(primary_key=True)
    feature = models.ForeignKey(Feature, on_delete=models.SET_NULL, null=True)
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True, related_name='product_features')
    product_feature_value = models.CharField(max_length=255, null = False)

Поэтому я хочу получить product_features для каждого продукта, и я использовал prefetch_related так:

product_data = Product.objects.filter(brand__brand_id = brand_data.brand_id).prefetch_related('product_features')

, но в шаблоне теперь отображаются связанные данные модели вот код шаблона:

{% for products in product_data %}
      {{ products.product_name }}
      {% for a in product_data.product_features.all %}
         <li>{{ a.product_feature_value }}</li>
      {% endfor %}
{% endfor %}

Пожалуйста, помогите мне, я попробовал все, но ничего не работает!

1 Ответ

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

Вы указываете product_data.product_features, но product_data является коллекцией из Product с. Это должно быть product.product_features (поскольку products является единственным Product объектом, лучше назвать его product, а не products):

{% for <b>product</b> in product_data %}
      {{ <b>product</b>.product_name }}
      {% for a in <b>product</b>.product_features.all %}
         <li>{{ a.product_feature_value }}</li>
      {% endfor %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...