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
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)
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.
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)