获取模型中所有值的列表

时间:2014-02-27 20:00:29

标签: python django list

我试图通过验证字段来清理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))

2 个答案:

答案 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))

祝你好运!