如何限制Django中相关管理器返回的对象数

时间:2019-07-30 14:11:21

标签: python django django-models orm django-orm

我有两个型号Category和Product

class Category(models.Model):
    name = models.CharField(max_length=200,
                               db_index=True)
    slug = models.SlugField(max_length=200,
                            unique=True,)
    description = models.CharField(max_length=50,
                                      blank=True)



class Product(models.Model):
    category = models.ForeignKey(Category,
                                 related_name='products',
                                 on_delete=models.CASCADE)
    name = models.CharField(max_length=200,
                               db_index=True)
    description = models.TextField(blank=True)
    slug = models.SlugField(max_length=200, db_index=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)
    featured = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

想要的行为是返回带有的所有类别,每个类别应包含10种产品

我尝试返回所有类别而不限制产品返回的对象,然后在模板中使用了切片过滤器,但是我不确定这对于大规模是否有效,并且我不确定Django是否会延迟加载产品。 现在视图如下

def product_list(request):
    featured_products = Product.objects.filter(featured=True).all()
    categories = Category.objects.all()

    return render(request,
                  template_name='home/home.html',
                  context={'categories': categories,
                           'featured_products': featured_products})

我使用的方式是有效的还是使用Category.objects.all()查询类别时应该限制产品?

1 个答案:

答案 0 :(得分:0)

是的,这是一种通常的方法。 Django的查询集是惰性的,在您将结果切片到模板中之后,将无法访问数据库,并且切片会(某种程度上)达到数据库级别。