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

时间:2019-04-17 06:27:04

标签: python django django-models django-templates

我正在遵循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)列出品牌(tempates / appname / 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放在正确的位置。我猜想,必须有一个更好的方法。

有人可以帮助我以适当的方式做到吗?

1 个答案:

答案 0 :(得分:0)

使用prefetch_related来优化查询,

css=tr:nth-child(2) > td > table > tbody > tr:nth-child(3) > td:nth-child(1)

有关更多详细信息,请参见documentation