【问题标题】:Django model method vs custom manager [closed]Django模型方法与自定义管理器[关闭]
【发布时间】:2019-06-17 10:27:32
【问题描述】:

我无法在使用自定义管理器还是模型方法之间做出决定。我有一个模型User 并有一个查询来查找特定用户范围内的其他用户。

所以我的两个选择是:

class UserManager(models.Manager):
    def find_users_in_radius(self, user):
        return super().get_queryset().filter(
            location__distance_lt=(
                user.location, Distance(mi=user.search_radius))).exclude(
            pk=user.pk)

class User(AbstractUser):
    .....
    users_in_radius = UserManager()

User 模型上的方法:

class User(AbstractUser):
    .....
    def users_in_search_radius(self):
        return User.objects.filter(
            location__distance_lt=(
                self.location, Distance(mi=self.search_radius))).exclude(
            pk=self.pk)

在我看来,我会使用第一种方法获得查询结果:User.users_in_radius.find_users_in_radius(request.user)

或第二种方法:request.user.users_in_search_radius()

我更喜欢第二种选择,但我想知道这是否是不好的做法。我还没有看到任何人在模型方法中调用User.objects 的例子。是否有其他方法可以做到这一点,或者自定义管理器是更好的方法?

【问题讨论】:

  • 我认为第二个选项没有任何问题。它更方便,使用objects 在模型方法中不是问题。

标签: django orm model


【解决方案1】:

当您想要修改默认管理器(objects)或添加额外的管理器方法(默认管理器中不存在)时,您只需要定义一个自定义管理器。

所以,如果您可以使用默认管理器而无需修改它,那么为什么要重新发明轮子。

【讨论】:

    【解决方案2】:

    具体而言,您应该使用非管理器版本,如果您使用自定义管理器,您还将添加一个方法(而不是在管理器 QuerySet 上工作),并且您还必须提供用户参数。

    使用方法让用户实例有责任找到自己附近的用户。

    更不用说您必须使用第一个选项编写更多代码,而且它也会更慢。

    user.user_in_radiuos.find_users_in_radius(user)  # Two attribute lookpus, redundance: calling object == parameter.
    user.users_in_search_radius()  # Clean, no redundance.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-07
      • 2011-04-20
      • 2016-03-03
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多