查询集和切片的问题

时间:2017-12-07 18:39:51

标签: django django-queryset

我有2个模型,CompanyProductProduct有一个到Company

的ForeignKey
class Product(Meta):
    company = models.ForeignKey(
        Company, 
        related_name='products', 
        on_delete=models.CASCADE
    )

我执行以下过滤:

 company = Company.objects.filter(account=account, pk=company_pk)
        if not company:
            raise Http404
        product = Product.objects.filter(company=company, pk=product_pk)
        if not product:
            raise Http404
        return product

我有以下错误:

The QuerySet value for an exact lookup must be limited to one result using slicing.

company_pkproduct_pk只是变量。如果我删除了产品过滤器,则没有错误。

我认为它发生是因为公司结果是一个QuerySet并在Product.objects.filter

中作为参数被推送

3 个答案:

答案 0 :(得分:10)

公司是一个查询集。你可能想做

Product.objects.filter(company=company[0], pk=product_pk)

或者更好的是,您可以使用ORM中的关系简化为1次查找。

Product.objects.get(company__account=account, company__pk=company_pk, pk=product_pk) 

答案 1 :(得分:9)

正如公认的答案所述,公司是一个查询集。

The QuerySet value for an exact lookup must be limited to one result using slicing.

而不是这个

product = Product.objects.filter(company=company, pk=product_pk)

试试这个

product = Product.objects.filter(company__in=company, pk=product_pk)

__ in可以处理大于一的查询集(表的多个记录)。

这可以在文档的django Many-to_one relationships部分找到。 https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_one/

Django文档因为它的长度和深度而对像我这样的初学者来说可能会很吓人,但是如果你能破解它,它会为大多数问题提供解决方案。

答案 2 :(得分:0)

当您为要搜索的值传递查询集时,也会产生此错误。

Company.objects.filter(account=account, pk=company_pk)实际上返回一个查询集,并且该查询集不能在此查询Product.objects.filter(company=company, pk=product_pk)中使用,而不会产生错误消息。

这里真正缺少的是.get,就像

company = Company.objects.filter(account=account, pk=company_pk).get()company = Company.objects.get(account=account, pk=company_pk)