以下のコードをご覧ください。基本的に、ユーザーがこのクラスのオブジェクトを作成するときは、を指定する必要がありますvalue_type
。If value_type==2
(percentage)、then percentage_calculated_on
(これは、フォーム/テンプレート側のCheckboxSelectMultipleで、1つ以上の項目をチェックする必要があります。モデルの検証では、私が試みているように検証できません。基本的に、次のような例外がスローされます。多対多の関係を使用するには、インスタンスに主キー値が必要であるとのことですが、保存する前にまずオブジェクトを検証する必要があります。この検証をフォーム(モデルフォーム)側で試しました(フォームのクリーンな方法)ですが、同じことがそこでも起こります。
この検証を達成するにはどうすればよいですか?
INHERENT_TYPE_CHOICES = ((1, 'Payable'), (2, 'Deductible'))
VALUE_TYPE_CHOICES = ((1, 'Amount'), (2, 'Percentage'))
class Payable(models.Model):
name = models.CharField()
short_name = models.CharField()
inherent_type = models.PositiveSmallIntegerField(choices=INHERENT_TYPE_CHOICES)
value = models.DecimalField(max_digits=12,decimal_places=2)
value_type = models.PositiveSmallIntegerField(choices=VALUE_TYPE_CHOICES)
percentage_calculated_on = models.ManyToManyField('self', symmetrical=False)
def clean(self):
from django.core.exceptions import ValidationError
if self.value_type == 2 and not self.percentage_calculated_on:
raise ValidationError("If this is a percentage, please specify on what payables/deductibles this percentage should be calculated on.")