Как использовать несколько моделей в представлении общего списка на основе класса 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 продукта и получить данные, относящиеся к этому продукту.