“ReverseManyToOneDescriptor”对象没有属性“all”

Nik*_*kur 3 python django

我是 Django 新手,我正在尝试通过模型访问属于类别的产品CategoryProduct我在类别中使用外键。这些是我的模型:

class Category(models.Model):
    name = models.CharField(max_length=140)
    slug = models.SlugField(blank=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("shop:category", kwargs= 
                {"category_slug": self.slug})

class Product(models.Model):
    category = models.ForeignKey(Category, 
                               on_delete=models.CASCADE)
    brand = models.ForeignKey(Brand, 
                               on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    description = models.TextField()
    image = models.ImageField(upload_to=image_name)
    price = models.PositiveIntegerField()
    avaliable = models.BooleanField(default=True)

    def get_absolute_url(self):
         return reverse("shop:product", kwargs={
                       "product_slug": self.slug,                                           
                       "product_ctgr_slug": 
                                   self.category.slug,})
Run Code Online (Sandbox Code Playgroud)

我的观点:

class CategoryDetailView(DetailView):
    model = Category
    category_products = Category.product_set.all()
    slug_url_kwarg = "category_slug"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = self.categories
        context['category_products'] = self.category_products
        return context
Run Code Online (Sandbox Code Playgroud)

但 Django 给了我一个AttributeError: 'ReverseManyToOneDescriptor' object has no attribute 'all'.
我究竟做错了什么?

小智 5

真正的问题是,原始发布者试图从而不是实例中调用RelatedManager.all()函数。

category_products = Category.product_set.all()

类别是类名。既然是类,它就不会也不可能知道单个实例的相关产品。

您必须从实例调用RelatedManagers.all() 函数,而不是类本身。