获取具有一对多关系的数据的正确方法是什么

问题描述 投票:0回答:1

我正在关注Django中的一个教程,在那里我发现了一个特定的for循环来获取实际过滤数据的模型中的实体。

以下是型号(models.py)

class Brand(models.Model):
    name = models.CharField(max_length=30)
    origin = models.CharField(max_length=50)

class Model(models.Model):
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    model_name = models.CharField(max_length=30)

class Review(models.Model):
    article = models.CharField(max_length=2000)
    label_model = models.ManyToManyField(Model)

以下是views.py

from django.views import generic
from .models import Brand
from .models import Model
from .models import Review

class BrandListView(generic.ListView):
    template_name = 'phonereview/brands.html'
    context_object_name = 'all_phone_brands'

    def get_queryset(self):
        return Brand.objects.all()

class ModelDetailView(generic.DetailView):
    model = Brand
    template_name = 'phonereview/models.html'

class ReviewDetailView(generic.DetailView):
    model = Model
    template_name = 'phonereview/reviews.html'

以下是模板1)上市品牌(templates / app name / brands.html)

<ul>
    {% for brand in all_phone_brands %}
        <li>
            <a href = "{% url 'phonereview:models' brand.slug %}">
                {{ brand.name }}
            </a>
        </li>
    {% endfor %}
</ul>

这里的all_phone_brands来自views.py。 2)用于列出手机型号的模板

<ul>
    {% for model_item in brand.model_set.all  %}
    <li>
        <a href="{% url 'phonereview:reviews' model_item.slug %}">
            {{ model_item.model_name }}
        </a>
    </li>
    {% endfor %}
</ul>

即使代码有效,我也不确定brand.model_set.all是否正确。我想,必须有一个更好的方法呢。

谁能帮助我以正确的方式做到这一点?

python django django-models django-templates
1个回答
0
投票

使用prefetch_related优化查询,

Brand.objects.prefetch_related('model_set')

有关详细信息,请参阅documentation

© www.soinside.com 2019 - 2024. All rights reserved.