在Django中,最好从self获取对象列表并使用相关名称或从对象本身获取并使用过滤器?

时间:2012-04-12 16:56:10

标签: python django django-models django-queryset

标题可能令人困惑,但我不知道如何解释它。这是一个例子。

做这样的事情会更好吗

class UserType( models.Model ) :
    def user_count( self ) :
        return self.userprofile_set.count()

还是喜欢这个?

class UserType( models.Model ) :
    def user_count( self ) :
        # Does "user_types = self" work? I'm not sure.
        return UserProfile.filter( user_types = self.pk ).count()

,其中

class UserProfile( models.Model ) :
    user_types = models.ManyToManyField( UserType )

UserType.user_count()只返回具有特定UserProfile的{​​{1}}个。

对不起,如果这是一个愚蠢而微不足道的问题,但我很好奇。也许一些Django专家可以深入研究实际的SQL性能或其他东西: - )。

1 个答案:

答案 0 :(得分:6)

他们是一样的。选择你喜欢的任何东西。

在我看来,第一个看起来更干净。第二个似乎有点不正确,因为user_types不是单个pk值。

顺便说一下,建议始终指定related_name属性。

例如,如果是:

user_types = models.ManyToManyField(UserType, related_name='profiles')

然后:

return self.profiles.count()

看起来更干净。

但两个语句都生成相同的sql,我们只能说第一个是第二个快捷方式。所以这不是关于sql-performance