嵌套字典的Django模型错误

时间:2020-08-11 18:41:39

标签: python django django-models

我是Django的新手,但不是python的新手,我的模型尝试使用一个类(在单独的文件中定义),该类中的数据来自REST API,检索到的数据位于嵌套字典中。该代码将在python中正常运行,但是当我在Django(makemigrations)中尝试时,出现错误:

GetFoundOnSelectItems中的文件“ c:\ blah-blah \ Clone_PR.py”,第20行 值= self._issueEdit [“字段”] [“ customfield_13940”] [“ allowedValues”] TypeError:“ NoneType”对象不可下标

我尝试使用类型提示,但这也不起作用。

models.py

from dal import autocomplete
from django.db import models
from django.contrib import messages
from .Login import jlogin
from .Jira_Constants import ProductionServer, TestServer, StageServer
from .Clone_PR import Issue

jira = None
issue = Issue()

class ClonePrLogin(models.Model):
    username = models.CharField(max_length=30)
    password = models.CharField(max_length=30)

    @classmethod
    def LoginToJira(cls):
        global jira
        jira = jlogin(ProductionServer, cls.username, cls.password)

class PrEntry(models.Model):
    prToClone = models.CharField(max_length=20)

    @classmethod
    def GetIssueAndMeta(cls):
        global issue
        issue.initialize(jira, cls.prToClone)

class ClonePr(models.Model):
    issueKey = issue.issueKey
    issue.GetFoundOnSelectItems()
    foundOnList = issue.foundOnSelectItems
    foundOn = autocomplete.Select2ListChoiceField(choice_list=foundOnList)

Clone_PR.py

from typing import List, Dict

class Issue():
    def __init__(self):
        self.jiraInst = None
        self.issueKey = ''
        self._issue = None
        self._issueEdit = None
        # self._issueEdit = Dict[str, Dict[str, Dict[str, List[Dict[str, str]]]]]
        self.foundOnSelectItems = []

    def initialize(self, jira, prKey):
        self.jiraInst = jira
        self.issueKey = prKey
        self._issue = jira.issue(prKey)
        self._issueEdit = jira.editmeta(prKey)

    def GetFoundOnSelectItems(self):
        values = self._issueEdit["fields"]["customfield_13940"]["allowedValues"]
        items = [x["value"] for x in values]
        self.foundOnSelectItems = items

1 个答案:

答案 0 :(得分:0)

在Django中,运行makemigrations将加载所有模块。您说过您熟悉Python,所以您应该知道该类内部的声明:

class ClonePr(models.Model):
    issueKey = issue.issueKey
    issue.GetFoundOnSelectItems()
    foundOnList = issue.foundOnSelectItems
    foundOn = autocomplete.Select2ListChoiceField(choice_list=foundOnList)

将在模块加载时运行。当时您正在呼叫issue.GetFoundOnSelectItems(),而后者依次呼叫values = self._issueEdit["fields"]["customfield_13940"]["allowedValues"],除了self._issueEdit = None在上面实例实例Issue的开头带有以下行:issue = Issue()之外。

高度建议您花一些时间来熟悉Django启动应用程序的方式。这里的模块级和嵌套模型声明都是反模式,将来可能会导致数据问题。

相关问题