Я пытаюсь найти способ реализовать как пользовательский QuerySet
, так и пользовательский Manager
без нарушения DRY. Это то, что у меня есть до сих пор:
class MyInquiryManager(models.Manager):
def for_user(self, user):
return self.get_query_set().filter(
Q(assigned_to_user=user) |
Q(assigned_to_group__in=user.groups.all())
)
class Inquiry(models.Model):
ts = models.DateTimeField(auto_now_add=True)
status = models.ForeignKey(InquiryStatus)
assigned_to_user = models.ForeignKey(User, blank=True, null=True)
assigned_to_group = models.ForeignKey(Group, blank=True, null=True)
objects = MyInquiryManager()
Это отлично работает, пока я не сделаю что-то вроде этого:
inquiries = Inquiry.objects.filter(status=some_status)
my_inquiry_count = inquiries.for_user(request.user).count()
Это быстро разрывает все, потому что QuerySet
не имеет тех же методов, что и Manager
. Я попытался создать пользовательский класс QuerySet
и реализовать его в MyInquiryManager
, но в итоге я реплицирую все мои определения методов.
Я также нашел этот фрагмент, который работает, но мне нужно передать дополнительный аргумент for_user
, чтобы он ломался, потому что он полагается в значительной степени на переопределение get_query_set
.
Есть ли способ сделать это без переопределения всех моих методов в подклассах QuerySet
и Manager
?