Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如果一个项目有单独的模型,与该项目相关的图像有单独的模型,如何将它们组合到查询中?_Django_Django Models_Django Views_Django Queryset - Fatal编程技术网

Django 如果一个项目有单独的模型,与该项目相关的图像有单独的模型,如何将它们组合到查询中?

Django 如果一个项目有单独的模型,与该项目相关的图像有单独的模型,如何将它们组合到查询中?,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

我试图在卡片视图中显示查询集中的项目。我有一个Item模型和一个ItemImage单独的模型,允许为单个项目上传多个图像。每个图像还具有一个属性,用于确定动态生成的卡中是否显示该图像

我已成功显示项目模型查询集中的项目详细信息。但是,我很难理解如何将itemimage.url属性与传递到模板中的所有_items上下文相结合。如何确保“我的图像查询集”中的图像与分配给它们的项目的主键匹配,并且也是该项目的主照片

views.py

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)