【发布时间】:2018-05-24 01:30:23
【问题描述】:
我有 2 个模型,公司和产品。
class Product(Meta):
company = models.ForeignKey(Company, related_name='products', on_delete=models.CASCADE)
形成我正在尝试获取公司数据和相应产品的数据库。
我只想从产品中获取名称并按updated_at、created_at 降序排列。
我正在使用 Prefetch 对象和 prefetch_related 并且我对它们的工作方式有很多误解。
def get_queryset(self):
qs = Company.objects.prefetch_related(
Prefetch('products', queryset=Product.objects.only('name').order_by('-updated_at', '-created_at'))).get()
return qs
我收到的错误是:
get() returned more than one Company
因为我用))) 关闭了prefetch_related 方法/函数:
我认为
get()将作用于 Company 对象并使用来自 url 的 pk/slug 获取它(在 DetailView 中默认执行)。好像不是这样的。我已经在 Prefetch 对象中使用了 'products' 的相关名称,为什么在查询集中需要再次告诉模型
queryset=Product.objects....?
我在 django 文档中查看以下示例:
Question.objects.prefetch_related(Prefetch('choice_set')).get().choice_set.all()
如果Prefetch 对象中有“choice_set”,为什么最后会调用choice_set.all()?
Django 不是在 prefetch_related 中的 quesryset 中附加了产品到查询集(question.choice_set)吗?
我认为我的问题是我不了解执行顺序,我很困惑方法是如何链接的,即使被')'关闭
【问题讨论】:
-
@Alasdair - 文档:docs.djangoproject.com/en/2.0/ref/models/querysets/…(参见预取对象)
-
我认为如果文档中的示例不使用
get()会更好 - 这可能会造成混淆。