django中的奇怪的AttributeError

时间:2017-03-05 20:49:43

标签: python django

在我的模型文件中,我有额外的课程。

具有根据其他模型LeaseExtra

计算租约的物业租赁
class Extra(CommonInfo):
        number = models.CharField(max_length=30,null=True, blank=True)
        max_occupants = models.PositiveSmallIntegerField()
        floor = models.PositiveSmallIntegerField()
        _lease = None


        def _get_total(self):


            from lease.models import Lease
            from conditions.models import LeaseExtra

            le_dict = LeaseExtra.objects.filter(extra_id=self.id, is_active = True ).aggregate(Max('id'))

            if le_dict:
                lease =  le_dict.lease
            else:  
                lease =  0
            self._lease = lease


class LeaseExtra(CommonInfo):
    version = IntegerVersionField( )
    extra = models.ForeignKey(Extra,on_delete=models.PROTECT)
    lease = models.ForeignKey(Lease,on_delete=models.PROTECT)
    is_included = models.BooleanField(default=True)

为什么我在这个模型类中遇到错误?

  

例外值:

     
    

'dict'对象没有属性'lease'

  
Traceback:
File "C:\Users\PAPA\DEV\rent_unit\rent_unit_venv\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\PAPA\DEV\rent_unit\rent_unit_venv\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "C:\Users\PAPA\DEV\rent_unit\src\unit\views.py" in extra_available_list
  163.     extra_list = [obj for obj in extra_list if ( (obj.lease)==0)]
File "C:\Users\PAPA\DEV\rent_unit\src\unit\models.py" in lease
  182.             self._get_total()
File "C:\Users\PAPA\DEV\rent_unit\src\unit\models.py" in _get_total
  160.             lease =  le_dict.lease

Exception Type: AttributeError at /unit/list/extra/available/
Exception Value: 'dict' object has no attribute 'lease'

1 个答案:

答案 0 :(得分:1)

由于使用了'filter'函数,

le_dict被初始化为一个查询集。即它不是单个对象实例。

因此,引用'lease'属性是没有意义的,因为可能已经返回了许多LeaseExtra实例的查询集。

如果要引用特定模型实例的“租约”,可以执行以下操作:

le_dict = LeaseExtra.objects.get(pk=some_id)

get()方法要求您使用唯一标识符(如主键)来执行查询。