簡體   English   中英

AttributeError: 'NoneType' object 沒有屬性 'attname'

[英]AttributeError: 'NoneType' object has no attribute 'attname'

我正在使用這個django_multitenant庫來實現多租戶。 我嘗試使用以下代碼在 python manage.py shell 中創建 object

>>> from ReportingWebapp.models import *
>>> from django_multitenant.utils import *
>>> org = Organization.objects.first()
>>> set_current_tenant(org)
>>> get_current_tenant()
<Organization: Organization object (1)>
>>> a = ApplicationSetting(username="a",password="b",client_secret="c",client_id="d",tenant_id="e")

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django_multitenant\mixins.py", line 58, in __init__
    super(TenantModelMixin, self).__init__(*args, **kwargs)
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django\db\models\base.py", line 416, in __init__
    self._state = ModelState()
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django_multitenant\mixins.py", line 62, in __setattr__
    if (attrname in (self.tenant_field, get_tenant_field(self).name)
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django_multitenant\mixins.py", line 115, in tenant_field
    return self.tenant_id
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django\db\models\query_utils.py", line 149, in __get__
    instance.refresh_from_db(fields=[field_name])
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django\db\models\base.py", line 623, in refresh_from_db
    db_instance_qs = self.__class__._base_manager.db_manager(using, hints=hints).filter(pk=self.pk)
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django\db\models\base.py", line 573, in _get_pk_val
    return getattr(self, meta.pk.attname)
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django\db\models\query_utils.py", line 147, in __get__
    val = self._check_parent_chain(instance)
  File "C:\Users\hp\Desktop\reporting_multitenant\env\lib\site-packages\django\db\models\query_utils.py", line 163, in _check_parent_chain
    return getattr(instance, link_field.attname)
AttributeError: 'NoneType' object has no attribute 'attname'

為什么我會收到此錯誤? 租戶已在線程本地設置。

模型.py

class Organization(TenantModel):
    tenant_id = 'id'
    org_name = models.CharField('Organization Name',max_length=200)
    num_agents = models.PositiveIntegerField(
        'Number of agents',
        help_text = 'Approximate number of agents who possess microsoft teams license'
        )
    admin_name = models.CharField(max_length=50)
    admin_email = models.EmailField()


class ApplicationSetting(TenantModel):
    org = models.ForeignKey(Organization,on_delete=models.CASCADE)
    tenant_id='organization_id'
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=100)
    client_id = models.CharField(max_length=255)
    client_secret = models.CharField(max_length=255)
    tenant_id = models.CharField(max_length=255, null=True)
    user_token = models.TextField(null=True)
    app_token = models.TextField(null=True)

我懷疑問題是由於您在ApplicationSetting model 中聲明的tenant_id model 字段造成的。 在內部,您使用的 package 似乎使用tenant_id作為與租戶相關的外鍵的字段名稱的引用。

由於您將tenant_id聲明為可為空的字段,因此原來的tenant_id='organization_id'不再存在。 當您初始化ApplicationSetting時, TenantManager查找名為None的字段並嘗試查找它的相關名稱(通過attname屬性),因此會出現錯誤。

要解決此問題,請刪除tenant_id字段。

之后,您可能會遇到不同的異常,因為您的ApplicationSetting model 不包含名為organization的字段。 要解決此問題,您需要重命名org字段:

organization = models.ForeignKey(Organization,on_delete=models.CASCADE)'

或者,您可以改為將tenant_id更改為org_id

免責聲明:我對您使用的 package 一點也不熟悉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM