Как запросить все поля в родительской и дочерней модели, связанные с внешним ключом в 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>

Надеюсь, это ответ на ваш вопрос.

Вернуться на верх