循环遍历 Django 的属性列表

Looping through a list of attirubutes from Django

基本上,到目前为止我已经了解到,以正确的方式编写代码意味着您不必复制和粘贴很多东西。至少从我读到的内容来看是这样。

我基本上需要根据布尔语句分配我的 Django 模型点。如果 True 加分,否则不加分。点值会改变,但现在我将它们设置为 1。

我可以 copy/paste 因为其中许多是我必须记录分数的,或者我可以看看是否有更简单的方法,所以最终这就是我的问题,有没有更简单的方法?

        scores_bool = {
            'spc': 1,
            'medical': 1,
            'photo_id': 1,
            'presolo_test': 1,
            'presolo_checkout': 1,
            'endorsement_solo': 1,
            'solo': 1,
            'dual_xc': 1,
            'inst_training': 1,
            'dual_night': 1,
            'tol_tower': 1,
            'solo_xc': 1,
            'solo_xc_150': 1,
            'checkride_prep': 1,
        }
        if ppl.spc:
            ppl.points += scores_bool['spc']
        if ppl.medical:
            ppl.points += scores_bool['medical']
        if ppl.photo_id:
            ppl.points += scores_bool['photo_id']
        if ppl.presolo_test:
            ppl.points += scores_bool['pre_solo_test']
        

所以基本上每个 ppl 属性都有一个 True False 语句,如果为真,则将点添加到它......等等

理想情况下,我会循环遍历 scores_bool.keys() 并说出如下内容:

for i in scores_bool.keys():
if ppl.i: 
    ppl.points += scores_bool[i] 


Thankyou! 

我认为你很接近,但是 ppl.i 行不通,getattr(ppl, i, None) 行。

for i in scores_bool.keys():
if getattr(ppl, i, None): 
    ppl.points += scores_bool[i] 

使用内置 getattr 方法。

for i in scores_bool.keys():
    if getattr(ppl, i): 
       ppl.points += scores_bool[i]

有关如何通过字符串名称调用方法的更多信息,read this