Python 如何将Django模型元选项应用于我没有编写的模型?

Python 如何将Django模型元选项应用于我没有编写的模型?,python,django,Python,Django,我想将Meta选项应用于Django.contrib.auth.models中的Django模型用户。通常,我只会在模型的定义中放置元类,但在本例中,我没有定义模型。那么,我应该将修改用户模型的元类放在哪里呢?: 您还可以使用代理模型在模型上定义不同的默认顺序。标准用户模型没有定义排序(有意地;排序很昂贵,我们不想在获取用户时一直这样做)。使用代理时,您可能希望定期按用户名属性排序。这很简单: 现在,普通用户查询将是无序的,OrderedUser查询将按用户名排序 请注意,要使其工作,您需要对D

我想将Meta选项应用于Django.contrib.auth.models中的Django模型用户。通常,我只会在模型的定义中放置元类,但在本例中,我没有定义模型。那么,我应该将修改用户模型的元类放在哪里呢?

您还可以使用代理模型在模型上定义不同的默认顺序。标准用户模型没有定义排序(有意地;排序很昂贵,我们不想在获取用户时一直这样做)。使用代理时,您可能希望定期按用户名属性排序。这很简单:

现在,普通用户查询将是无序的,OrderedUser查询将按用户名排序

请注意,要使其工作,您需要对Django进行主干签出,因为它是相当新的


如果您不能访问它,您将需要去掉代理部分并以这种方式实现它,这可能会变得很麻烦

您可以将用户子类化:

class OrderedUser(User):
    class Meta:
        ordering = ['-id', 'username']
或者您可以使用ModelAdmin中的排序:

class UserAdmin(admin.ModelAdmin):
    ordering = ['-id', 'username']

# unregister user since its already been registered by auth
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

注意:ModelAdmin方法只会更改admin中的顺序,而不会更改查询的顺序。

请与作者联系并要求他们进行更改。

Paolo的回答非常好;我以前不知道新的代理支持。唯一的问题是您需要将代码定位到OrderedUser模型,这在某种意义上类似于简单地执行
User.objects.filter(..).order\u by('username')
。换句话说,它不那么冗长,但您需要显式地编写代码以实现它。(当然,如上所述,您还必须坐在行李箱上。)

我的感觉是,你希望所有的
用户
查询都被订购,包括在你无法控制的第三方应用中。在这种情况下,修补基类相对容易,也不太可能导致任何问题。在中心位置(如settings.py),您可以执行以下操作:

from django.contrib.auth.models import User
User.Meta.ordering = ['username']

更新:Django 1.5现在支持。

请注意,目前,代理模型仅在Django的开发(SVN)版本中受支持。我在回答中指出了这一点,但我想我会加粗,因为这是一件需要注意的重要事情。+1代表代理。我甚至不知道它的存在。1.1将是一个很好的版本。对不起,一开始没有注意到这一点;你得到了我的+1。代理非常棒。:-)你使用的是哪个版本的Django?如果是这样的话,一定要看看Daniel下面的答案。我想当他说“我不定义它”时,他的意思是Django模型,代码在核心。代码失败;您将改为执行此操作:User.\u meta.ordering=['username']。您测试过吗?如果你在settings.py中这样做,在已安装的应用程序中的应用程序模型初始化之前,我认为它应该可以工作..啊,我只是在控制台中测试了它。不过,我想我还是建议你换一下monkeypatching。Ryan的方法更好。在settings.py中导入模型是非常糟糕的做法,可能会导致损坏。我不同意。。。最好在django发挥元编程的魔力并将类转换成其他东西之前,先挂接到模型中,而不是像文献中描述的那样+1:修复管理员。您停止了向自定义视图函数的相关视图查询添加顺序。
from django.contrib.auth.models import User
User.Meta.ordering = ['username']