Django-将2个上下文数据集分组为1个forloop

时间:2019-04-21 11:53:50

标签: python django django-models django-queryset

对于每个产品,我需要显示其所有评论以及随附的个人资料图片,这需要查询3个模型,但是我最多需要2个for循环,因为当我执行Profile for loop时,所有图像都显示如下,如下所示。理想情况下,评论和个人资料数据集会组合在一起,因此每个评论仅显示一张个人资料图片。

是否可以解决此问题?

models.py

class Product(models.Model):
    name = models.CharField(max_length=100)
    brand = models.CharField(max_length=100)
    cost = models.DecimalField(max_digits=8, decimal_places=2, default=0.00)
    category = models.CharField(max_length=100)
    releasedate = models.DateField()
    description = models.TextField()
    productphoto = models.ImageField(default='products/default_product.jpg', upload_to='products')

class Review(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    rating = models.PositiveSmallIntegerField(default=1, validators = [MinValueValidator(1), MaxValueValidator(5)])
    reviewtext = models.TextField()

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    profilephoto = models.ImageField(default='profiles/default_profile.jpg', upload_to='profiles')

views.py

class ProductDetailView(TemplateView):
    # template_name = 'reviewApp/test.html'
    template_name = 'reviewApp/product_detail.html'
    def get_context_data(self, **kwargs):
        prod = self.kwargs['pk']
        context = super(ProductDetailView, self).get_context_data(**kwargs)
        context['Products'] = Product.objects.filter(id=prod)
        context['Reviews'] = Review.objects.filter(product=prod)
        profile_ids = Review.objects.filter(product=prod).values_list('profile_id', flat=True)
        context['Profiles'] = Profile.objects.filter(id__in=profile_ids)
        return context

product.html

        {% for prod in Products %}
            <img src="{{prod.productphoto.url}}">
            {{ prod.brand }} {{ prod.name }}
            £{{ prod.cost }}
            {{ prod.category }}
            {{ prod.releasedate }}
            {{ prod.description }}
        {% endfor %}

        {% for rev in Reviews %}
          {% for prof in Profiles %}
            <img src="{{prof.profilephoto.url }}">
          {% endfor %}
         {{ rev.rating }}
         {{ rev.author }}
         {{ rev.reviewtext }}
        {% endfor %}

视图 Current View

1 个答案:

答案 0 :(得分:1)

您可以将个人资料图片查询为rev.profile.profilephoto