【问题标题】:Django makemigrations IssueDjango makemigrations 问题
【发布时间】:2017-04-10 13:37:22
【问题描述】:

我被难住了。我有一个自定义模型字段类,它查找两个参数:app_name 和 file_dir。

在我的模型定义中,我有这个:

files = MultiFileUploadAndViewer(app_name = getAppName(), file_dir='RequestedFiles', blank=True)

getAppName() 是:

#appconfig imported from apps.py 
def getAppName():
    return <appConfig>.name

自定义字段定义为:

class MultiFileUploadAndViewer(models.FilePathField):

def __init__(self, *args, **kwargs):
    print(kwargs['app_name'])
    self.app_name = kwargs.pop('app_name')
    self.file_dir = kwargs.pop('file_dir','') + '\\'
    self.path = MEDIA_ROOT + '\\' + self.app_name + '\\' + self.file_dir
    self.upload_url = reverse(self.app_name +':File Upload') + '\\' + self.file_dir
    kwargs.update({'path':self.path})
    super(MultiFileUploadAndViewer, self).__init__(*args, **kwargs)

我删除了迁移文件夹中的所有内容,init.py 除外。

在运行 makemigrations 时,它会抛出一个 KeyError,抱怨 'app_name' 不在 kwargs 中。

但是,请注意字段 init 方法中对 print() 的调用。这成功打印了 app_name。 KeyError 紧随其后。 init 函数是否被调用了两次?因此在 'app_name 之后抛出错误 从 kwargs 中弹出?我该如何解决这个问题?如果我在 pop() 方法中为 app_name 提供默认值,则此方法有效,但如果 kwargs 中不存在 app_name(或 file_dir),我希望它出错。

【问题讨论】:

    标签: python django makemigrations


    【解决方案1】:

    这里的超类models.FilePathField再次调用init方法:

    super(MultiFileUploadAndViewer, self).__init__(*args, **kwargs)
    

    你正在这里删除 kwargs app_name

    self.app_name = kwargs.pop('app_name')
    

    【讨论】:

    • 哇,我对发生的事情有一个根本的误解。我以为超级调用会运行超类的 init?
    • 是的,它正在执行,但没有 app_name 和 file_dir 关键字参数,因为您将它们弹出
    • 我很困惑为什么 FilePathField(超类)调用 MultiFileUploadAndViewer(我的自定义子类)init。如果我不弹出 kwargs,FilePathField 会抱怨收到意外的 kwargs。
    • 超类没有调用子类,不能添加import pdb; pdb.set_trace() 和弹出后调试?
    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多