Как использовать несколько моделей в представлении общего списка на основе класса django

Вот мой код для файла models.py,

from django.db import models
from config.g_model import TimeStampMixin


# Create your models here.
class Variant(TimeStampMixin):
   title = models.CharField(max_length=40, unique=True)
   description = models.TextField()
   active = models.BooleanField(default=True)


class Product(TimeStampMixin):
   title = models.CharField(max_length=255)
   sku = models.SlugField(max_length=255, unique=True)
   description = models.TextField()


class ProductImage(TimeStampMixin):
   product = models.ForeignKey(Product, on_delete=models.CASCADE)
   file_path = models.URLField()


class ProductVariant(TimeStampMixin):
   variant_title = models.CharField(max_length=255)
   variant = models.ForeignKey(Variant, on_delete=models.CASCADE)
   product = models.ForeignKey(Product, on_delete=models.CASCADE)


class ProductVariantPrice(TimeStampMixin):
   product_variant_one = models.ForeignKey(ProductVariant, on_delete=models.CASCADE, null=True,
                                        related_name='product_variant_one')
   product_variant_two = models.ForeignKey(ProductVariant, on_delete=models.CASCADE, null=True,
                                        related_name='product_variant_two')
   product_variant_three = models.ForeignKey(ProductVariant, on_delete=models.CASCADE,null=True,
                                          related_name='product_variant_three')
   price = models.FloatField()
   stock = models.FloatField()
   product = models.ForeignKey(Product, on_delete=models.CASCADE)

теперь я использую представление списка на основе класса,

class ProductListView(generic.ListView):
    model = Product
    template_name = 'products/list.html'
    context_object_name = 'products'
    paginate_by = 2
    def get_context_data(self, **kwargs):
        context = super(ProductListView, self).get_context_data(**kwargs)
        products = self.get_queryset()
        page = self.request.GET.get('page')
        paginator = Paginator(products, self.paginate_by)
        try:
            products = paginator.page(page)
        except PageNotAnInteger:
            products = paginator.page(1)
        except EmptyPage:
            products = paginator.page(paginator.num_pages)
       context['products'] = products
       return context

Я хочу использовать изображение товара, вариант товара и цену варианта товара в моем шаблоне, я не знаю, как использовать несколько моделей в этом представлении, если кто-нибудь может подсказать мне, это будет полезно

Переопределите свои модели для установки related_name следующим образом

class ProductImage(TimeStampMixin):
    # fields as it is
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product_images')

class ProductVariant(TimeStampMixin):
    # fields as it is
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product_variants')

class ProductVariantPrice(TimeStampMixin):
    # fields as it is
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product_variant_prices')

В views.py перекройте метод get_queryset

class ProductListView(generic.ListView):
    # as it is
    def get_queryset(self):
        return super().get_queryset().prefetch_related('product_images', 'product_variants', 'product_variant_prices')
    def get_context_data(self, **kwargs):
        # as it is

получить таблицу related joins по id продукта и получить данные, относящиеся к этому продукту.

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