web-dev-qa-db-ja.com

Django:複数の列を使用してソートするクエリを作成し、テンプレートで表示する方法

私はDjangoの初心者であり、MVC、DBクエリの経験はあまりありません。

Customer_name、city_name、state_name(外部キーテーブルから取得)を含むCustomerテーブルがあります。 HTMLでは、最初にstate_nameで、次にcity_nameで、次にcustomer_nameでアルファベット順にソートされたリストに結果を表示しようとしています。そのようです..

ARIZONA
   PHOENIX
     AAA, Inc.
     BBB, LLC.

   SCOTTSDALE
     AAA, LLC.
     DDD, Corp.

CALIFORNIA
   ANAHEIM
     ...

私のmodel.pyは次のとおりです。

from Django.db import models

class Customer(models.Model):
    def __unicode__(self):
        return self.customer_name

    customer_name = models.CharField(max_length=60)
    city_name = models.CharField(max_length=30)
    state = models.ForeignKey('State')

class State(models.Model):
    def __unicode__(self):
         return self.state_name

    state_name = models.CharField(max_length=20)
    state_code = models.CharField(max_length=2)

私のurls.pyには、次のものがあります。

url("^customers/$",
    direct_to_template,
    {'template': 'pages_fixed/customers.html',
    'extra_context': {'customers': Customer.objects.all().order_by('state')}},
    name='customers'),

そして、私のHTMLには、次のような機能するテンプレートがあります。

    <div class='customers'>
        {% for customer in customers %}
            <div class='block_customer'>
                <p>{{ customer.state.state_name }}</p>
                <p>{{ customer.city_name }}</p>
                <p>{{ customer.customer_name }}</p>
            </div>
        {% endfor %}
    </div>

それはあらゆる種類の機能ですが、明らかに正しくソートされておらず、それを設計する最善の方法はわかりません。テンプレートでいくつかの内部ループを試しましたが、テンプレートで並べ替えルールを定義できることを期待していましたが、これはサポートされていない/正しいようではありません。データを異なる方法でクエリする必要があるか、事前にコードで事前に並べ替える必要があると思いますか?これがビューで行われるかどうかわかりません(DjangoのControllerの形式は何ですか?)。

35
pete

テンプレートの表示順序モデルオブジェクトにはいくつかのレベルがあり、それぞれが前のレベルを上書きします。

  1. (MODEL LEVEL)メタ属性ordering回答で@Bithinが示すように(続きを読む Django docs
  2. (VIEW LEVEL)QuerySet _order_by_ method表示例で試したように、ソートする他のフィールドを追加した場合、希望どおりに動作します。

    Customer.objects.order_by('state', 'city_name', 'customer_name')

    詳細 Django docs)。 ここで.all()は必要ないことに注意してください。

  3. (テンプレートレベル)regroupテンプレートタグサンプルでネストを使用する必要があります(詳細については Django docs
72
juliocesar

モデル内で順序を指定できますが、

class Customer(models.Model):

    customer_name = models.CharField(max_length=60)
    city_name = models.CharField(max_length=30)
    state = models.ForeignKey('State')

    def __unicode__(self):
        return self.customer_name

    class Meta:
           ordering = ['customer_name', 'city_name', 'state']

お役に立てれば。

13
Bithin

「マスター」モデルの一部のフィールド(この場合は状態)で注文する場合は、次のように記述する必要があります。

Customer.objects.order_by('state__state_name', 'city_name', 'customer_name')

最初の状態の後のdouble _であるstate__state_nameを見て、そのモデルのフィールドにアクセスします。

2
DanielB