当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将Django模型元选项应用于我没有编写的模型?》经验,为你挑选了2个好方法。

我想从django.contrib.auth.models向Django模型用户应用"排序"元选项.通常我会将Meta类放在模型的定义中,但在这种情况下我没有定义模型.那么我在哪里放置Meta类来修改User模型呢?



1> Paolo Bergan..:

这就是Django手册建议你这样做的方法:

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

class OrderedUser(User):
    class Meta:
        ordering = ["username"]
        proxy = True

现在,普通的用户查询将被取消排序,OrderedUser查询将按用户名排序.

请注意,要实现此功能,您需要对Django进行中继检查,因为它很新.

如果您无法访问它,您将需要摆脱代理部分并以这种方式实现它,这可能会很麻烦.查看这篇文章,了解如何完成此任务.



2> Daniel Naab..:

保罗的答案很棒; 我以前没有意识到新的代理支持.唯一的问题是你需要将你的代码定位到OrderedUser模型 - 这在某种意义上类似于简单地执行User.objects.filter(....).order_by('username').换句话说,它不那么冗长,但你需要明确地编写代码来定位它.(当然,如上所述,你也必须在行李箱上.)

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

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

更新:Django 1.5现在支持可配置的用户模型.


推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有