我正在使用xlrd读取Excel。其中一列具有银行名称,该名称通过外键链接到车辆型号。当xlrd读完一行时,它应该将该记录保存到车辆表中。然而,获取Vehicles.bank必须是Banks实例的实际pk值和错误。来自外键的Django模型实例
经过检查与这个问题有关的几十个问题后,我发现这个one是最相似的一个,但是我还没有得到预期的结果。
相关车辆模型部分如下:
class Vehicles(models.Model):
stock = models.CharField(max_length=10, blank=False, db_index=True)
vin = models.CharField(max_length=17, blank=False, db_index=True)
sold = models.DateField(blank=True, null=True, db_index=True)
origin = models.CharField(max_length=10, blank=False, db_index=True)
bank = models.ForeignKey('banks.Banks', db_column='bank', null=True)
我使用python 2.7,Django的1.5.4和PostgreSQL 9.2.5
。 Dbshell实用程序确实表明银行表具有涉及车辆表的外部限制,通过银行(id)。
由于我没有使用这个特定部分的表单,所以我认为使用ModelForm是否无关紧要。
当前场景:Excel文件具有FBANK作为单元格值。银行表中有一个存在的记录,其名称列中包含FBANK,id = 2。蟒蛇行是:
def bank(value):
return Banks.objects.get(name=value).id
根据上述行,错误是: 不能分配“2”:“Vehicles.bank”必须是一个“银行”的实例。
如果我最后删除了“.id”,那么错误是: 银行匹配查询不存在。
感谢您的帮助。 Ricardo
谢谢@nickzam。在测试了两个选项后,我最终使用了get_bank_instance选项。问题:我很难得到像Django页面上那样的选项的文档。具体而言,[模型实例引用](https://docs.djangoproject.com/en/1.5/ref/models/instances)并不表示与此类选项相关的任何内容。更重要的是,如果我搜索,是的,有多个页面,但没有具体的(或至少容易识别“哦,我需要做X或Y”。你有任何建议像这样的情况?谢谢 – Rmartin
get_bank_instance只是我创建的一个帮助函数,用于说明如何返回模型实例。您应该查看https://docs.djangoproject.com/en/1.5/ref/models/querysets/#get https ://docs.djangoproject.com/en/1.5/ref/models/querysets/#create并在shell中运行(运行manage.py shell并导入模型),使用django模型和实例。 – nickzam
感谢实际上,我使用的编码块类似于你添加的编码块(每场1行),因为有一些字段需要验证,其他字段也有一个外键,最重要的是,一些字段是必需的,所以如果Excel文件有一个空值或一个没有正确验证或者其外键没有如果不存在,我想警告用户并且不要创建该记录。 – Rmartin