Фильтрация для поиска товаров в базе данных

Filters.py

import django_filters

from .models import *

class ProductFilter(django_filters.FilterSet):
    class Meta:
        model=Product
        fields=['name',]

Класс продукта в models.py

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.FloatField()
    digital = models.BooleanField(default=False,null=True, blank=True)
    image=models.ImageField(null=True, blank=True)
    description=models.CharField(max_length=400, default='SOME STRING', null=True)

Класс OrderItem в models.py

class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

views.py

def store(request):
    if request.user.is_authenticated:
        customer = request.user.customer
        # Returns a tuple of (object, created), 
        # where object is the retrieved or created object and 
        # created is a boolean specifying whether a new object was created.
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems=order.get_cart_items
    else:
        #Create empty cart for now for non-logged in user
        items = []
        order = {'get_cart_total':0, 'get_cart_items':0}
        cartItems=order['get_cart_items']

    products = Product.objects.all()
    myFilter=ProductFilter(request.GET, queryset=items)
    items=myFilter.qs
    context = {'products':products, 'cartItems': cartItems, 'myFilter': myFilter}
    return render(request, 'store/store.html', context)

файл шаблонов (main.html)

<form class="form-inline mr-auto my-lg-0" method="get">
         <input class="form-control mr-sm-2" style="width:1000px; height:38px;" type="text" placeholder="Search for items" aria-label="Search">
           {{myFilter.form}}
         <button class="btn btn-outline-warning btn-rounded btn-sm my-0" style="width:80px; height:38px" type="submit">Search</button>
</form>

Ошибка поля в / Не удается разрешить ключевое слово "имя" в поле. Возможные варианты: дата_добавления, идентификатор, заказ, идентификатор_заказа, продукт, идентификатор_продукта, количество.

Метод запроса: ПОЛУЧИТЬ

URL-адрес запроса: http://127.0.0.1:8000/?name=Fifa+20

Версия Django: 2.2

Тип исключения: FieldError

Значение исключения:

Невозможно разрешить ключевое слово "имя" в поле. Возможные варианты: date_added, id, order, order_id, product, product_id, amount.

Местоположение исключения: D: \ ecom \ venv \ lib \ site-packages \ django \ db \ models \ sql \ query.py в names_to_path, строка 1420

Исполняемый файл Python: D: \ ecom \ venv \ Scripts \ python.exe

Версия Python: 3.6.5

После того, как я нажал на поиск с одним из действительных продуктов в каталоге, он показывает мне вышеуказанную ошибку. Из этого я сделал два вывода.

1. name is a valid field in Product class in models.py
2. the other fields(date_added, id, order etc) mentioned in the image are fields of OrderItem class in models.py

но поскольку я хочу выполнить поиск в каталоге продуктов, поле модели в filters.py должно быть установлено на продукты, для которых «имя» является допустимым полем.

Я хочу решить эту проблему и искать товары в своем магазине. Как мне изменить свой код?


person Shaurya    schedule 18.05.2020    source источник


Ответы (1)


ProductFilter указывает на модель продукта.

Но здесь вы используете items для набора запросов для ProductFilter

myFilter=ProductFilter(request.GET, queryset=items)

Но элементы содержат набор запросов OrderItem Model-

items = order.orderitem_set.all()

Следовательно, он показывает список доступных вариантов выбора для фильтра из модели OrderItem, а не из модели продукта.

person Zeeshan Siddiqui    schedule 18.05.2020
comment
Ой! просто просмотрел это. Исправил, назначив набор запросов для продуктов, и это сработало. Большое спасибо! - person Shaurya; 18.05.2020