我试图找到一种方法来实现一个自定义的 QuerySet
和一个自定义的 Manager
而不破坏干燥。以下是我目前掌握的情况:
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
子类中的所有方法的情况下做到这一点?