我试图通过验证字段来清理Django中的数据库输入。所以我有一个库模型,它有一个字段“type”,可以是列表中的任何值。我的库模型声明如下所示:
class Library(models.Model):
library_id = models.CharField(max_length=30, unique=True, db_index=True)
library_name = models.CharField(max_length=100, unique=True,help_text="NOT allowed chars: "+", ".join(ILLEGAL_CHARS))
account = models.ForeignKey(Account, blank=True, null=True)
EXPERIMENT_TYPES = (
('Member1','Description Member1'),
('Member2', 'Description Member1'),
('Member3', 'Description Member1'),
('Member4', 'Description Member1'),
('Member5', 'Description Member1'),
('Member6', 'Description Member1'),
('Member7','Description Member1'),
)
experiment_type = models.CharField(max_length=50, choices=EXPERIMENT_TYPES, default='Member1')
如果我有价值,我需要的是什么 的myType = “Member90” 能够进行测试以确保myType处于EXPERIMENT_TYPES
我现在所拥有的是这种,这是有效的。但应该有更好的方法。
try:
Library.objects.filter(experiment_type=myType)
except:
library_errors.append("Json has invalid value \'%s\' in \'Experiment Type\' field. Experiment Type does not exist." % (myType))
答案 0 :(得分:0)
您可以使用模型静态选择元组而不是db:
进行检查if myType not in [e[0] for e in Library.EXPERIMENT_TYPES]:
library_errors.append('...')
答案 1 :(得分:0)
我个人会做的是过滤掉有效/预期的结果,只留下无效的结果:
# Retrieve a list of valid values for experiment_type
valid_experiment_types = list(map(lambda x: x[0], Library.EXPERIMENT_TYPES))
# Now, exclude any valid experiment_type(s) from your QuerySet
invalid_objects = Library.objects.exclude(
experiment_type__in=valid_experiment_types
)
# What you are left with is nothing but invalid values
# Let's see what they are...
print(invalid_objects.values_list('experiment_type', flat=True))
"""
Sample Output:
['Member90', 'Member40']
"""
# Let's view all of the information available
print(invalid_objects.values())
"""
Sample Output:
[{'library_id': '12345', 'library_name': 'Test', 'account': 1123, 'experiment_type': 'Member90'}, {'library_id': '678', 'library_name': 'Neat', 'account': 5464, 'experiment_type': 'Member40'}]
"""
获得无效值后,您可以决定如何处理它们。您剩下的是QuerySet,因此您可以轻松查看任何值。
继续上面的例子,你可以这样做:
# Set up the errors list
library_errors = []
# Loop through the invalid objects and add your error message
for obj_value in invalid_objects.values_list('experiment_type', flat=True):
library_errors.append("Json has invalid value \'%s\' in \'Experiment Type\' field. Experiment Type does not exist." % (obj_value))
祝你好运!