Как запросить все поля в родительской и дочерней модели, связанные с внешним ключом в Django ? где id совпадает с родительским классом?
У меня 3 модели в этом проекте
class products(models.Model):
product_id = models.CharField(max_length=10, blank=False, null=False, primary_key=True)
name = models.CharField(max_length=20, blank=False)
description = models.TextField(blank=True, null=True)
userslikedproduct = models.ManyToManyField(UserAccount, blank=True)
def __str__(self):
return self.product_id
class productReviews(models.Model):
review_id = models.CharField(max_length=10, blank=False, null=False, primary_key=True)
product = models.ForeignKey(products, related_name='reviews', on_delete=models.CASCADE)
user = models.ForeignKey(UserAccount, related_name='users', on_delete=models.CASCADE)
review_desc = models.TextField(blank=True, null=True)
review_rating = models.IntegerField(choices=RATING, null=True)
date_added = models.DateTimeField(verbose_name='date_added', auto_now_add=True)
class ReviewImage(models.Model):
review = models.ForeignKey(productReviews, related_name='review_images', on_delete=models.CASCADE)
image = models.ImageField(null=True, blank=True, upload_to="/images/")
Я хочу получить все отзывы, связанные с идентификатором продукта, вместе с изображениями отзывов.
Я пробовал использовать
Query1 = productReviews.objects.all().filter(product=product).values().order_by('-date_added')
Query2 = ReviewImage.objects.filter(review__product__product_id=product).values_list('review', 'image')
Запрос1 дает все объекты без изображений Запрос2 дает все изображения и идентификаторы рецензий без объектов рецензий
Как я могу получить все отзывы об одном конкретном товаре вместе с изображениями отзывов?
Я думаю, что вам не нужно использовать values или values_list. Это превращает ваши объекты в Python dicts, или списки.
Я думаю, что вы ищете что-то вроде этого:
# To get all reviews
reviews = product.reviews.all().order_by('date_added')
# To get all reviews as Python dicts
reviews_as_dict = reviews.values()
for review, review_dict in zip(reviews, reviews_as_dict):
# Now you can get review images assigned to each review like this
review_images = review.review_images.all()
# Update the review_dict to include the review_image data
review_dict['review_images'] = review_images.values()
Однако это кажется излишним. Если вы передаете эти данные в шаблон, вы могли бы просто добавить первую переменную reviews к контексту и использовать ее в шаблоне следующим образом:
<div>
{% for review in reviews %}
<h1>Review {{ review.review_rating }}</h1>
<small>Description {{ review.review_desc }}</small>
<h3>Review images for this review</h3>
<ul>
{% for review_image in review.review_images.all %}
<li><img src="{{ review_image.image.url }}"></img></li>
{% endfor %}
</ul>
{% endfor %}
</div>
Надеюсь, это ответ на ваш вопрос.