gpt4 book ai didi

Django 多对多调用太多

转载 作者:行者123 更新时间:2023-12-03 23:38:56 25 4
gpt4 key购买 nike

我有一个简单的 m2m 关系如下:

class Category(ModelBase):
name = models.CharField(max_length=255)
icon = models.CharField(max_length=50)


class Course(ModelBase):
name = models.CharField(max_length=255, unique=True)
categories = models.ManyToManyField(Category, related_name="courses")
我正在使用 ListView 显示一个类别中的所有类(class)或所有类(class)(如果没有提供类别)。
View .py
class CourseListView(ListView):


model = Course
paginate_by = 15
template_name = "courses.html"
context_object_name = "courses"

def get_queryset(self):
queryset = (
super()
.get_queryset()
.select_related("tutor")
.prefetch_related("categories")
.filter(active=True)
)
category_id = self.kwargs.get("category_id")
return (
queryset
if not category_id
else queryset.filter(categories__in=[category_id])
)

def get_context_data(self, *args, **kwargs: Any) -> Dict[str, Any]:
context = super().get_context_data(**kwargs)
category_id = self.kwargs.get("category_id")
if category_id:
context["current_category"] = Category.objects.get(id=category_id)
context["categories"] = Category.objects.all()
return context
当我在模板中做这样的事情时,Django 正在重复调用。
<div class="icon"><span class="{{ course.categories.first.icon }}"></span></div>
不知道为什么,非常感谢帮助。谢谢!

最佳答案

当您这样做时.prefetch_related('categories')当您访问 course.categories.all 时将使用此预取的结果. course.categories 上的任何其他查询集将做一个新的查询。自 course.categories.first是一个新的查询集,它不使用预取的结果。
您想在模板中访问的是来自 course.categories.all() 的第一个结果.但这在模板中并不容易。我会在 Course 上推荐一种方法模型:

class Course(...):
...

def first_category(self):
# Equivalent to self.categories.first(), but uses the prefetched categories
categories = self.categories.all()
if len(categories):
return categories[0]
else:
return None
然后在你的模板中你可以调用这个方法
<div class="icon"><span class="{{ course.first_category.icon }}"></span></div>

关于Django 多对多调用太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67221191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com