Django 如果一个项目有单独的模型,与该项目相关的图像有单独的模型,如何将它们组合到查询中?
我试图在卡片视图中显示查询集中的项目。我有一个Item模型和一个ItemImage单独的模型,允许为单个项目上传多个图像。每个图像还具有一个属性,用于确定动态生成的卡中是否显示该图像 我已成功显示项目模型查询集中的项目详细信息。但是,我很难理解如何将itemimage.url属性与传递到模板中的所有_items上下文相结合。如何确保“我的图像查询集”中的图像与分配给它们的项目的主键匹配,并且也是该项目的主照片 views.pyDjango 如果一个项目有单独的模型,与该项目相关的图像有单独的模型,如何将它们组合到查询中?,django,django-models,django-views,django-queryset,Django,Django Models,Django Views,Django Queryset,我试图在卡片视图中显示查询集中的项目。我有一个Item模型和一个ItemImage单独的模型,允许为单个项目上传多个图像。每个图像还具有一个属性,用于确定动态生成的卡中是否显示该图像 我已成功显示项目模型查询集中的项目详细信息。但是,我很难理解如何将itemimage.url属性与传递到模板中的所有_items上下文相结合。如何确保“我的图像查询集”中的图像与分配给它们的项目的主键匹配,并且也是该项目的主照片 views.py from django.shortcuts import rende
from django.shortcuts import render, redirect
# Create your views here.
from django.http import HttpResponse
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
from .models import Item, ItemImage
def home(request):
all_items = Item.objects.all()
item_images = ItemImage.objects.all() ItemImage.objects.filter(is_primary=True)
context = {'items': all_items}
return render(request,'items/home.html',context)
models.py
from django.db import models
from django.utils import timezone
from decimal import Decimal
# Create your models here.
class Item(models.Model):
name = models.CharField(max_length=70)
date_added = models.DateTimeField(default=timezone.now)
price = models.DecimalField(max_digits=9, decimal_places=2, default=Decimal('0.00'))
description = models.CharField(max_length=300)
def __str__(self):
return self.name
class ItemImage(models.Model):
url = models.CharField(max_length=2000)
is_primary = models.BooleanField(default=False)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
home.html
{% extends "base.html" %}
{% block content %}
<div class="content-section d-flex flex-row">
{% if items%}
{% for item in items %}
<div class="card" style="width: 18rem;">
<img class="card-img-top" src="{{item.image_ur}}" alt="Card image cap">
<div class="card-body">
<h5 class="card-title">{{item.name}}</h5>
<p class="card-text">{{item.description}}</p>
<a href="#" class="btn btn-primary">Add to cart</a>
</div>
</div>
{% endfor %}
{% else %} <h2> No items available. </h2>
{% endif %}
</div>
{% endblock content %}
{%extends“base.html”%}
{%block content%}
{%if items%}
{items%%中的项的%s}
{{item.name}
{{item.description}
{%endfor%}
{%else%}没有可用的项目。
{%endif%}
{%endblock内容%}
您可以使用获取每个项目的主项目图像
s,方法是:
from django.db.models import Prefetch
def home(request):
all_items = Item.objects.prefetch_related(
Prefetch(
'itemimage_set',
ImageItem.objects.filter(is_primary=True)
to_attr='primary_images'
)
)
context = {'items': all_items}
return render(request,'items/home.html',context)
注意:Django有一个
使集合为空时呈现消息更方便
您可以使用为每个项目
获取主项目图像
s,方法是:
from django.db.models import Prefetch
def home(request):
all_items = Item.objects.prefetch_related(
Prefetch(
'itemimage_set',
ImageItem.objects.filter(is_primary=True)
to_attr='primary_images'
)
)
context = {'items': all_items}
return render(request,'items/home.html',context)
注意:Django有一个
使集合为空时呈现消息更方便
预回迁解决方案对我有效。我尝试的另一个解决方案是执行原始查询。可能有一种更简洁的基于模型的解决方案,但现在我更容易阅读原始SQL
def home(request):
all_items = Item.objects.raw("SELECT items_item.id, items_item.name, items_item.description, items_item.price, items_item.date_added, items_itemimage.url AS imgurl FROM items_item LEFT JOIN items_itemimage ON items_item.id = items_itemimage.item_id WHERE items_itemimage.is_primary = true ORDER BY date_added DESC")
context = {'items': all_items}
return render(request,'items/home.html',context)
预回迁解决方案对我有效。我尝试的另一个解决方案是执行原始查询。可能有一种更简洁的基于模型的解决方案,但现在我更容易阅读原始SQL
def home(request):
all_items = Item.objects.raw("SELECT items_item.id, items_item.name, items_item.description, items_item.price, items_item.date_added, items_itemimage.url AS imgurl FROM items_item LEFT JOIN items_itemimage ON items_item.id = items_itemimage.item_id WHERE items_itemimage.is_primary = true ORDER BY date_added DESC")
context = {'items': all_items}
return render(request,'items/home.html',context)