Как мне получить пертикулярную подкатегорию с тем же именем в другой категории в Django?

#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 , поскольку нет различия между двумя подкатегориями с одинаковым именем. Вы можете, например, добавить «категорию» (родительскую), чтобы сделать фильтрацию более точной, или использовать первичный ключ подкатегории.