当我在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_name
和last_name
字段添加信息,company_name
为空,is_company=False
为空。
如果last_name
字段为is_company
,则我希望按False
对这些记录进行排序;如果company_name
为is_company
,我希望按True
对这些记录进行排序。
这可能吗?
编辑一个例子(按要求,排序)
对于我的应用,此customer
表包含有关安全系统所有者的信息。有时,安全系统安装在住宅环境中。在这种情况下,系统的所有者是一个人 - 因此,我会将first_name
和last_name
输入customer
记录。有时系统安装在商业环境中,因此所有者是公司。为此,我只输入company_name
字段,其他字段留空。
现在,当我提供新安全系统安装的估算时,我可以向新客户或现有客户(现有客户,但为他们提供新位置)提供估算。当它是现有客户时,我有一个下拉框,其中列出了所有现有客户(customer
表中的所有记录)。
这就是我想要正确订购所有记录的地方。就像现在一样,我得到了数百条记录的混乱,使得找到现有的所有者变得残酷。
希望这有助于我正在努力实现的目标。
答案 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_name
或company_name
,并将姓氏和公司名称放在同一个字段中并按其排序。