かなり複雑な自作フォームをModelForm
Django の に変換しています。このフォームは本番環境で 1 年以上使用されているため、できるだけ多くの落とし穴を取り除き、ユーザーに追加の機能を提供しようとしています。
Transaction
、Commission
およびの 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
ますか? それとも私はこれを完全に間違って見ていますか?