Ошибка атрибута: объект 'QuerySet' не имеет атрибута 'name'

В моем Django проекте у меня есть список товаров, в котором пользователи указывают категории при отправке формы "Crate New Item". Маршрут по умолчанию показывает этот список товаров с названием, описанием и категорией товара. Пользователи могут нажать на каждую категорию, чтобы быть перенаправленными на страницу соответствующей категории, где я пытаюсь отобразить все товары, относящиеся к этой категории.

Для этого я хочу проверить, есть ли категория, представленная в форме, в нашей базе данных категорий. Если да, то товар должен быть добавлен на страницу существующей категории, а если нет, то должна быть создана новая категория.

Однако я получаю ошибку атрибута при попытке проверить это в отправке формы, и я застрял. Буду признателен за любую помощь.

AttributeError at /create
'QuerySet' object has no attribute 'name'
error line :  if category == all_categories.name: 

models.py:

class User(AbstractUser):
    pass

class Category(models.Model):
    name = models.CharField(max_length = 64, null = True)


class AuctionItem(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE, related_name = "created_by")
    title = models.CharField(max_length = 64)
    description = models.TextField()
    price = models.DecimalField(max_digits = 100 ,decimal_places = 2)
    image = models.URLField(blank = True)
    category = models.ForeignKey(Category, on_delete = models.CASCADE, related_name = "item_category")
    date = models.DateTimeField(auto_now_add = True)

urls.py:

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("create", views.create_listing, name="create"),
    path("listing/<int:listing_id>", views.listing, name = "listing"),
    path("<str:user>/watchlist", views.watchlist, name= "watchlist"),
    path("closed", views.closed, name = "closed"),
    path("category/<int:category_id>", views.category, name = "category")
]

views.py:

@login_required 
def create_listing(request):
    if request.method == "POST": #if the create listing form is submitted
        title = request.POST["title"] #get the provided title
        description = request.POST["description"] #get the provided description
        price = request.POST["price"] #get the provided price
        image = request.POST["image"] #get the provided image
        category = request.POST["category"] #get the provided category
    
        all_categories = Category.objects.filter(name = category)
    
        if category == all_categories.name:
            item = AuctionItem.objects.create( #create new auction item with given properties
                user = request.user,
                title = title,
                description = description,
                price = price,
                image = image,
                category = category
            )
        else:
            new_category = Category.objects.create(name = category)
            item = AuctionItem.objects.create( #create new auction item with given properties
                user = request.user,
                title = title,
                description = description,
                price = price,
                image = image,
                category = new_category
            )

        return HttpResponseRedirect(reverse("index")) #after submitting the form, redirect user to the main page

    return render(request, "auctions/create_listing.html")

def category(request, category_id):
    category = Category.objects.get(id=category_id)
    items = AuctionItem.objects.filter(category=category)
    return render(request, "auctions/category.html", {
        "items" : items,
        "name" : category.name
    })

category.html:

{% extends "auctions/layout.html" %}

{% block body %}
    <h2>Category: {{name}}</h2>
    {% for item in items %}
    <div class = "frame">
        {% if item.image %}
            <img src="{{item.image}}" style= "width: 15vw;">
        {% endif %}
        {% if user.is_authenticated %}
        <h4><a href="{% url 'listing' item.id %}">{{item.title}}</a></h4>
        {% else %}
        <h4>{{item.title}}</h4>
        {% endif %}
        <br>
        <div id="text"><strong>Starting Price:</strong> ${{item.price}}</div>
        <div id="text"><strong>Description:</strong> {{item.description}}</div>
        {% if item.category %}
        <div id="text"><strong>Category: </strong><a href="{% url 'category' item.category.id %}">{{ item.category.name }}</a></div>
        {% endif %}
        <br>
        <div id="created">Created by {{item.user}}, on {{item.date}}</div>
    </div>
    {% endfor %}

{% endblock %}

Я думаю, что проблема в этом:

all_categories = Category.objects.filter(name = category)

filter() Возвращает новый QuerySet, содержащий объекты, которые соответствуют заданным параметрам поиска.

Я думаю, что вам нужно использовать это, потому что в вашей таблице нет таких данных.

all_categories = Category.objects.get(name = category)

В вашем views.py файле, Вы хотите сделать атрибут сравнения name в списке.

        all_categories = Category.objects.filter(name = category)
    
        if category == all_categories.name:

all_categories - это список объектов категории. all_categories = [ object, object, object]

А когда вы хотите сравнить вот так:

if category == all_categories.name:

Атрибут name больше не существует для all_categories = [ object, object, object].

вы должны проверить свою категорию следующим образом:

if Category.objects.filter(name=category).exists():
    ... use the exist category to relate you AuctionItem ...
else:
    ... create new category for relate your AuctionItem ...
Вернуться на верх