将不属于模型一部分的自定义字段加载到数据库

时间:2015-08-13 13:56:36

标签: django

如何将自定义字段中不属于模型的数据加载到数据库中? 我有这个模型

模型CompoundSynonym

compound = models.ForeignKey('MDictionary', blank=False, null=True)
synonym_type = models.ForeignKey('SynonymType')
synonym_name = models.CharField(max_length=50, blank=True, null=True, help_text=u'Synonym for the compound')


 def __unicode__(self):
     return u'%s' % (self.synonym_name)

我有一个form.py来为模型添加自定义字段。自定义字段是一个fileField,它采用带有synonym_names的文本文件。此自定义字段用于为特定化合物和synonym_type加载多个synonym_name。

模型文本文件

Rege574574
Rege337483
Rege394837
Rege348389

理论上,每当我从adminx页面单击“保存”时,我希望解析文件,并为特定化合物synonym_type插入文件中的synonym_name。

但在我的情况下,原始(模型)表单中的synonym_name被加载(当我提供文件时为空)

这就是我所拥有的:

form.py

class CompoundSynonymForm(ModelForm):
    file_upload = FileField(required=False)
    print "YES"


    def save(self, commit=True):

        file_upload = self.cleaned_data.get('file_upload', None)
        print file_upload

        with open("../../Downloads/model_file_upload.txt", 'r') as f:
            print "here "
            model_file = File(f)
            names = model_file.read()
            name_list = names.split('\n')
            for each_name in name_list:
               if each_name != 'Header':  
                 <this is where I have to save them>

        class Meta:
           model = CompoundSynonym

我从文件中获取文件解析和名称,但我无法将它们保存到数据库中。我应该如何从模型中将synonym_name覆盖到我的文件名?

更新

with open("../../Downloads/model_file_upload.txt", 'r') as f:
            print "here "
            model_file = File(f)
            names = model_file.read()
            name_list = names.split('\n')
            for each_name in name_list:
                if each_name != 'Header':
                    obj = super(CompoundSynonymForm, self).save(commit=False)
                    obj.synonym_name = each_name
                    if commit:
                        obj.save()
                    return obj

这只会保存文件的第一行。

1 个答案:

答案 0 :(得分:0)

你在with区块内所做的事情并没有多大意义。您实例化一个新的表单对象,由于某种原因,将其从文件中解析的名称传递给通常的POST数据。然后,使用相同的名称列表修改模型本身的synonym_name。最后,您忽略所有这些并调用现有表单的超类保存方法。

而不是所有这些,你想要做的只是修改从超类保存返回的对象,分配你的名字列表:

with open("../../Downloads/model_file_upload.txt", 'r') as f:
    model_file = File(f)
    names = model_file.read()
obj = super(CompoundSynonymForm, self).save(commit=False)
obj.synonym_name = names
if commit:
    obj.save()
return obj

虽然我不完全确定这是你想要做的;我认为你实际上想要浏览文件以找到与外键值匹配的同义词,但是你还没有显示任何代码来执行此操作。