Django - 根据标准订购模型记录?

时间:2012-01-24 04:33:48

标签: django django-models

当我在Django中构建模型时,我添加了以下信息:

def __unicode__(self):
  return self.some_field

class Meta:
  ordering = ['some_field_to_order_by']

是否可以根据某种ordering方案设置if/else

例如,我有一个customer模型,为了论证起见,这些模型包含以下字段:

first_name
last_name
company_name
is_company (boolean)

如果customer是公司,我只会将信息添加到company_name字段并设置is_company=True,而将其他两个留空。如果customer是某人,则我会向first_namelast_name字段添加信息,company_name为空,is_company=False为空。

如果last_name字段为is_company,则我希望按False对这些记录进行排序;如果company_nameis_company,我希望按True对这些记录进行排序。

这可能吗?

编辑一个例子(按要求,排序)

对于我的应用,此customer表包含有关安全系统所有者的信息。有时,安全系统安装在住宅环境中。在这种情况下,系统的所有者是一个人 - 因此,我会将first_namelast_name输入customer记录。有时系统安装在商业环境中,因此所有者是公司。为此,我只输入company_name字段,其他字段留空。

现在,当我提供新安全系统安装的估算时,我可以向新客户或现有客户(现有客户,但为他们提供新位置)提供估算。当它是现有客户时,我有一个下拉框,其中列出了所有现有客户(customer表中的所有记录)。

这就是我想要正确订购所有记录的地方。就像现在一样,我得到了数百条记录的混乱,使得找到现有的所有者变得残酷。

希望这有助于我正在努力实现的目标。

2 个答案:

答案 0 :(得分:2)

您可以创建自定义管理器,它可以执行您想要的操作。

class CompanyFilter(models.Manager):
   def get_query_set(self):
        qs = super(CompanyFilter, self).get_query_set()
        return qs.filter(is_company=True).order_by('company_name')

class PersonFilter(models.Manager):
   def get_query_set(self):
        qs = super(PersonFilter, self).get_query_set()
        return qs.filter(is_company=False).order_by('last_name')

class Contact(models.Model):
   # ... your regular fields

   companies = CompanyFilter()
   people = PersonFilter()


all_companies = Contact.companies.all()
all_people = Contact.people.all()
all_contacts = Contact.objects.all()

答案 1 :(得分:0)

1。假设其中一个字段始终为NULL,您可以使用extra查询:

  

  MyModel.objects
    .extra(select=dict(name='coalesce(last_name, company_name)'))
    .order_by('name')
  

(似乎所有主要数据库引擎都支持COALESCE

2。或者简单地删除last_namecompany_name,并将姓氏和公司名称放在同一个字段中并按其排序。