3

かなり複雑な自作フォームをModelFormDjango の に変換しています。このフォームは本番環境で 1 年以上使用されているため、できるだけ多くの落とし穴を取り除き、ユーザーに追加の機能を提供しようとしています。

TransactionCommissionおよびの 3 つのモデルがありUnit_typeます。Transactionは私の使用における中心的なモデルであり、Unit_type. はCommissionから派生したものUnit_typeですbase_type

BASE_CHOICES = (
    ('R', 'rent'),
    ('S', 'sale'),
)

class Unit_type(models.Model):
    unit_name = models.CharField(max_length=250)
    base_type = models.CharField(max_length=1, choices=BASE_CHOICES)


class Commission(models.Model):
    commission_name = models.CharField(max_length=250)
    base_type = models.CharField(max_length=1, choices=BASE_CHOICES)


class Transaction(models.Models):
    unit_type = models.ForeignKey(Unit_type)
    commission = models.ForeignKey(Commission, blank=True, null=True)

フォームを表示すると、次を使用しCommissionて同じ base_type を持つ sのみを表示できます。Unit_type

class TransactionForm(forms.ModelForm):

    class Meta:
        model = Transaction

    def __init__(self, unit_type, *args, **kwargs):
        super(TransactionForm, self).__init__(*args, **kwargs)

        self.fields['commission'].queryset = Commission_type.objects.filter(base_type=unit_type.base_type)

私は常にTransactionForm(instance=transaction, unit_type=unit_type)自分の意見に従ってフォームを作成します。

ここで、MySQL での簡単なクエリを実行すると、選択Commissionしたものに応じて、いくつかの s が多かれ少なかれ使用されることがわかりました。Unit

SELECT `unit_type_id`, `commission_id`, COUNT(*)
FROM `app_transaction`
GROUP BY `unit_type_id`, `commission_id`

結果として:

+----------------+-----------------+------------+
|  unit_type_id  |  commission_id  |  COUNT(*)  |
+----------------+-----------------+------------+
|             1  |              1  |       367  |
|             1  |              3  |         2  |
|             1  |              4  |        26  |
|             2  |              1  |       810  |
|             2  |              3  |        54  |
|             2  |              4  |       865  |
|             3  |              6  |      2065  |
|             3  |              7  |        16  |
|             3  |              8  |        79  |
+----------------+-----------------+------------+

self.fields['commission']今、上記の数に基づいてクエリセットを注文したいと思います。私はすでに in を使用values()してみました__init__():

def __init__(self, unit, *args, **kwargs):
        super(TransactionForm, self).__init__(*args, **kwargs)

        transactions = Transaction.objects.filter(unit_type=unit)
        transactions = transactions.values('commission').annotate(Count('commission)).order_by('-commission')

しかし今、クエリセットでこの順序を維持する方法に行き詰まっています。これに基づいて新しいクエリセットを実行する簡単な方法はありValuesQuerySetますか? それとも私はこれを完全に間違って見ていますか?

4

2 に答える 2

1

Count に kwarg を使用し、同じ kwarg を使用するだけです。order_by

transactions = transactions.annotate(commission_count=Count('commission)).order_by('-commission_count')

https://docs.djangoproject.com/en/1.5/topics/db/aggregation/#cheat-sheet

于 2013-08-21T09:15:09.067 に答える