首页 > 解决方案 > 在 Django 中是否可以在反向相关对象查找中调用自定义 `QuerySet` 方法?

问题描述

例如,有 nextmodels和 custom QuerySet

from django.db import models

class ActiveQuerySet(models.QuerySet):
    def active(self):
        '''returns only active objects'''
        '''supposing here would be a lot
           of more complicated code  
           that would be great to reuse
        '''
        return self.filter(is_active=True)   


class Category(models.Model):
    name = models.CharField(max_length=128, blank=True, null=True, default=None)


class Product(models.Model):
    name = models.CharField(max_length=128, blank=True, null=True)
    is_active = models.BooleanField(default=True)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, related_name='products', related_query_name="product", blank=True, null=True, default=None)
    objects = ActiveQuerySet.as_manager()

你能告诉我是否有办法调用这样的active()方法:

category = Category.objects.first()
category.products.active()

而不是这样做:

category.products.filter(is_active=True)

或者如何适当地实施这种行为?

标签: djangodjango-models

解决方案


您必须将自定义查询集添加到父模型中,而不是 _set。您可以将 custom_products 更改为任何其他词。

class ActiveQuerySet(models.QuerySet):
    def active(self):
        '''returns only active objects'''
        '''supposing here would be a lot
           of more complicated code  
           that would be great to reuse
        '''
        return self.products.filter(is_active=True)   

class Category(models.Model):
    name = models.CharField(max_length=128, blank=True, null=True, default=None)
    custom_products = ActiveQuerySet.as_manager()

category.custom_products.active()

推荐阅读