#python #django
#python #django
Вопрос:
У меня есть магазин-приложение, и есть categories
и subcategories
, у меня есть 3 категории, и под каждой из них есть вызываемая подкатегория Other
, и когда я нажимаю url
на нее, я получаю эту ошибку:
MultipleObjectsReturned at /categories/subcategory/Other, get() returned more than one SubCategory -- it returned 3!
Я понимаю, что using filter
— это не вариант, поскольку он вернет 3 значения, а URL-адрес не может принять набор запросов в качестве аргумента, могу ли я каким-то образом также использовать категорию title
subcategorys для фильтрации запроса или у вас есть какие-либо другие идеи?
Вот код:
urls.py
path('subcategory/<str:title>/', views.subcategory, name='subcategory'),
views.py
def subcategory(request, title):
subcategory = SubCategory.objects.get(title=title)
products = Product.objects.filter(subcategory=subcategory)
return render(request, 'subcategory.html', {'subcategory': subcategory,
'products': products})
Вот мои модели:
models.py
class Category(models.Model):
title = models.CharField(max_length=200, unique=True, blank=False, null=False)
class SubCategory(models.Model):
title = models.CharField(max_length=200, unique=False, blank=False)
category = models.ForeignKey(Category,
related_name='subcategories',
on_delete=models.CASCADE)
Комментарии:
1. Пожалуйста, покажите свой models.py
2. Вы можете избавиться от ошибки, написав
SubCategory.objects.filter(title=title).last()
. Но я не думаю, что это то, что вы хотите. Почему вы используете неуникальное поле в url в качестве идентификатора? (Включение ваших моделей, о которых идет речь, будет способствовать более четким ответам).3. хорошо, я включу свои модели через секунду
Ответ №1:
Вы можете фильтровать products
с помощью:
products = Product.objects.filter(subcategory__title=title)
таким образом, вы можете получить набор SubCategory
запросов s (может быть несколько) и Product
s с помощью:
def subcategory(request, title):
subcategory = SubCategory.objects.filter(title=title)
products = Product.objects.filter(subcategory__title=title)
return render(
request,
'subcategory.html',
{'subcategory': subcategory, 'products': products}
)
Комментарии:
1. У меня есть я
The QuerySet value for an exact lookup must be limited to one result using slicing
, также я использую что-то вроде URL-пути в моем шаблоне, и он использует вsubcategory
качествеurl
аргумента, поэтому набор запросов здесь действительно не вариант2. @SLDem: да, я допустил опечатку: это так
s/=subcategory/=title/
.3. Не могли бы вы объяснить эту часть
s/=subcategory/=title/
немного лучше, пожалуйста?4. nvm, я вижу, попробует
5. @SLDem: ну, это невозможно
title
, поскольку нет различия между двумя подкатегориями с одинаковым именем. Вы можете, например, добавить «категорию» (родительскую), чтобы сделать фильтрацию более точной, или использовать первичный ключ подкатегории.