我有这个型号:
class Journals(models.Model):
jid = models.AutoField(primary_key=True)
code = models.CharField("Code", max_length=50)
name = models.CharField("Name", max_length=2000)
publisher = models.CharField("Publisher", max_length=2000)
price_euro = models.CharField("Euro", max_length=2000)
price_dollars = models.CharField("Dollars", max_length=2000)
有没有办法让人们填写price_euro
或price_dollars
?
我知道解决问题的最佳方法是只有一个字段和另一个指定货币的表,但我有约束而我无法修改数据库。
谢谢!
答案 0 :(得分:4)
界面没有必要反映数据结构。您可以简单地让您的UI显示1个货币字段,然后选择美元和欧元,然后当数据提交回期刊模型时,您只需将其分配到正确的字段并清除另一个。
答案 1 :(得分:3)
JSR223 Test Elements这意味着,除了常规的模型级验证(此方法自从永久生效以来,就一直被用户Tom提出)之外,您现在可以确保无效数据完全无法进入数据库。
# models.py
from django.db import models
from django.db.models import Q
class Journals(models.Model):
# [...]
def clean(self):
"""Ensure that only one of `price_euro` and `price_dollars` can be set."""
if self.price_euro and self.price_dollars:
raise ValidationError("Only one price field can be set.")
class Meta:
contraints = [
models.CheckConstraint(
check=(
Q(price_euro__isnull=False) &
Q(price_dollars__isnull=True)
) | (
Q(price_euro__isnull=True) &
Q(price_dollars__isnull=False)
),
name='only_one_price',
)
]
请确保在Meta.constraints
更改后创建并应用迁移。
答案 2 :(得分:2)
我同意T. Stone的观点,customizing the form是最好的选择。如果您不能这样做,或者除此之外,您可以使用custom clean() method on your form强制执行规则。请记住,您在clean()方法中抛出的任何验证错误都不会附加到特定字段,而是附加到表单本身。
答案 3 :(得分:1)
我会在模型clean()方法上做到这一点。这样它也可以与管理站点一起使用。
https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.clean