首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django管理中模型中自定义字段的排序

django管理中模型中自定义字段的排序
EN

Stack Overflow用户
提问于 2014-04-25 00:53:22
回答 2查看 1.9K关注 0票数 1

我想为django管理中的自定义模型字段提供排序功能。

代码类似于

代码语言:javascript
复制
class MyModel(models.Model):

    first_name = models.CharField()
    last_name = models.CharField()

    def most_recent_mailing_date(self):
        """ Return the most recent mailing date """
        mailingHistories = self.mailinghistory_set.all()

        if len(mailingHistories) != 0:
            today = datetime.date.today()
            mostRecentHistory = None
            diff = -1

            for mailingHistory in mailingHistories:

                if mailingHistory.mailing_date < today and (diff == -1 or (today - mailingHistory.mailing_date) < diff):

                    mostRecentHistory = mailingHistory
                    diff = today - mostRecentHistory.mailing_date

            if mostRecentHistory is None:
                return "No Mailing History"
            else:
                return mostRecentHistory.mailing_date
        else:
            return "No Mailing History"


    most_recent_mailing_date.admin_order_field = 'self.most_recent_mailing_date'

我想订购的字段是most_recent_mailing_date。这是一个自定义字段。有可能吗?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-25 01:11:02

我觉得这不可能。来自文档

您有四个可能的值可以在list_display中使用: …… 表示模型上的属性的字符串。这几乎与可调用的行为相同,但在此上下文中的self是模型实例。下面是一个完整的模型示例:

代码语言:javascript
复制
from django.db import models from django.contrib import admin

class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()

    def decade_born_in(self):
        return self.birthday.strftime('%Y')[:3] + "0's"
    decade_born_in.short_description = 'Birth decade'

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'decade_born_in')

因此,您的字段是第四个选项。然而:

有几个关于list_display的特殊情况需要注意: ..。 通常,不属于实际数据库字段的list_display元素不能用于排序(因为Django在数据库级别执行所有排序)。 .(接着描述不适用于这里的异常)。

因此,您只能对实际的数据库字段进行排序。

票数 2
EN

Stack Overflow用户

发布于 2014-04-25 01:10:54

您不能使用Django的order_by,因为它是在数据库级别应用的。数据库不知道任何关于python方法和属性的信息。

但是,您可以在Python中进行排序。

代码语言:javascript
复制
objects = MyModel.objects.all()
sorted(objects, key=lambda k: k.most_recent_mailing_date())

如果你想要倒序,

代码语言:javascript
复制
objects = MyModel.objects.all()
sorted(objects, key=lambda k: k.most_recent_mailing_date(), reverse=True)

咨询

  • 我认为你应该对你的回归类型保持一致。如果没有邮件历史记录,您可以返回一些旧日期,而不是返回一个字符串。
  • 我认为您应该考虑在most_recent_mailing_date()上使用@property装饰器,这样就可以简单地将其称为instance.most_recent_mailing_date。这将使它在某种程度上与引用实际模型字段的方式一致。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23282383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档