私は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の形式は何ですか?)。
テンプレートの表示順序モデルオブジェクトにはいくつかのレベルがあり、それぞれが前のレベルを上書きします。
ordering
回答で@Bithinが示すように(続きを読む Django docs )(VIEW LEVEL)QuerySet _order_by
_ method表示例で試したように、ソートする他のフィールドを追加した場合、希望どおりに動作します。
Customer.objects.order_by('state', 'city_name', 'customer_name')
(詳細 Django docs)。 ここで.all()
は必要ないことに注意してください。
regroup
テンプレートタグサンプルでネストを使用する必要があります(詳細については Django docs )モデル内で順序を指定できますが、
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']
お役に立てれば。
「マスター」モデルの一部のフィールド(この場合は状態)で注文する場合は、次のように記述する必要があります。
Customer.objects.order_by('state__state_name', 'city_name', 'customer_name')
最初の状態の後のdouble _であるstate__state_nameを見て、そのモデルのフィールドにアクセスします。