web-dev-qa-db-fra.com

Problèmes avec le jeu de requêtes et le découpage

J'ai 2 modèles, Company et Product, avec Product ayant une clé étrangère vers Company

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

Je fais le filtrage suivant:

 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

Et j'ai l'erreur suivante:

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

company_pk et product_pk ne sont que des variables. Si je supprime le filtre produit, il n'y a pas d'erreur.

Je suppose que cela se produit car le résultat de la société est un QuerySet et est poussé comme argument dans Product.objects.filter

11
user3541631

La société est un ensemble de requêtes. Vous voudrez peut-être faire

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

Ou mieux encore, vous pouvez utiliser les relations dans l'ORM pour simplifier en 1 recherche.

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

Comme indiqué dans la réponse acceptée, la société est un ensemble de requêtes.

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

Au lieu de cela

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

essaye ça

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

__in peut gérer des ensembles de requêtes supérieurs à un (plusieurs enregistrements d'une table).

Cela peut être trouvé dans la section Django Relations plusieurs-à-un de la documentation. https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_one /

La documentation de Django peut être effrayante pour un débutant comme moi en raison de sa longueur et de sa profondeur, mais elle fournit des solutions à la plupart des problèmes si vous pouvez la casser.

13
Tyranno Taiwo

Cette erreur peut également être créée lorsque vous passez un ensemble de requêtes pour la valeur que vous recherchez.

Company.objects.filter(account=account, pk=company_pk) renvoie en fait un ensemble de requêtes et cet ensemble de requêtes ne peut pas être utilisé dans cette requête Product.objects.filter(company=company, pk=product_pk) sans produire le message d'erreur.

Ce qui manque vraiment ici, c'est un .get, Soit comme

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

0
boatcoder