2012-01-24 13 views
1

私はジャンゴでモデルを構築し、私は、以下の情報を追加します。基準に基づくDjango-orderモデルレコード?

def __unicode__(self): 
    return self.some_field 

class Meta: 
    ordering = ['some_field_to_order_by'] 

それはif/elseシナリオの並べ替えに基づいてorderingを設定することは可能ですか?

例えば、私は議論のために、これらのフィールドを持っている、customerモデルがあります:残し、

first_name 
last_name 
company_name 
is_company (boolean) 

customerが会社である場合は、私が唯一company_nameフィールドに情報を追加してis_company=Trueを設定します他の2つの空白。 customerが人物の場合は、とlast_nameフィールドに情報を追加し、company_nameは空白にし、is_company=Falseのままにします。

私はis_companyTrueある場合is_companyフィールドがFalsecompany_nameある場合last_nameすることにより、これらのレコードをソートします。

これは可能ですか?例えば

EDIT(リクエストあたり、ソートの)私のアプリのために

は、このcustomerの表は、セキュリティシステムの所有者に関する情報を保持しています。時には、セキュリティシステムが居住環境に設置されることもあります。この場合、システムの所有者は人なので、customerレコードにfirst_namelast_nameと入力します。システムが商業的な環境に設置されている場合がありますので、所有者は会社です。このためには、company_nameフィールドだけを入力し、他のフィールドは空白のままにします。

新しいセキュリティシステムのインストールの見積もりを提供する際に、新しい顧客または既存の顧客(既存の顧客であるが新しい場所)に見積もりを提供することができます。既存の顧客の場合、既存のすべての顧客(customerテーブルのすべてのレコード)をリストするドロップダウンボックスがあります。

これは、すべてのレコードを適切に注文するための場所です。今のように、私は何百もの記録が混乱して、既存の所有者を見つけるのが残酷になってしまいます。

これは私が達成しようとしていることに役立ちます。

+1

もちろん。クエリーセットに明示的なorder_by呼び出しを追加します。metaクラスでこれを設定すると、それを行う方法が見つかったとしても、メタは企業と人の両方を含むコレクションであるテーブル全体の並べ替えを定義するため、意味がありません。 – akonsu

+0

@akonsu - 私は事実上常に人や会社だけでなく、すべての企業とすべての人物をまとめて表示します。だからこそ私は注文書を 'queryset'で定義することなく注文する方法を見つけ出す必要があります。 – Garfonzo

+0

企業と人の両方を含むクエリーセットをどのように注文したいのかを明確にしてください。 – akonsu

答えて

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() 
+0

面白い、ありがとう。私はこれをさらに調べます。 – Garfonzo

0

1。


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

COALESCEはすべての主要なデータベースエンジンでサポートされているようだ)

2:あなたはextraクエリを使用することができますNULLフィールドのどちらかが常にあると仮定。または単にlast_nameまたはcompany_nameのいずれかを削除し、同じフィールドに姓と会社名を入れて並べ替えます。