Возможно ли в Django вызывать пользовательский метод `QuerySet` при обратном поиске связанных объектов? - PullRequest
0 голосов
/ 04 апреля 2020

Например, есть следующие models и пользовательские 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)

Или как правильно реализовать такое поведение?

1 Ответ

1 голос
/ 04 апреля 2020

Вы должны добавить пользовательский набор запросов в родительскую модель, а не _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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...