Django模型和关系

时间:2013-06-12 01:01:15

标签: python django django-models

我继承了一个经过重新设计的数据库,其中包括添加外键和唯一约束。因此,之前的测试对这些模型无效,我正在重写单元测试。

我的models.py文件中有两个类:

class Parentorgs(models.Model):
  parentorg_id = models.IntegerField(primary_key=True)
  parentorg = models.CharField(max_length=100L, db_column='ParentOrg', unique = True)
  eff_date = models.DateField()
  exp_date = models.DateField(null=True, blank=True)
  class Meta:
    db_table = 'txn_parentorgs'

class Contracts(models.Model):
  parentorg_id = models.ForeignKey(Parentorgs)
  contractnum = models.CharField(max_length=10L, db_column='ContractNum', primary_key = True)
  eff_date = models.DateField()
  exp_date = models.DateField(null=True, blank=True)
  contractname = models.CharField(max_length=100L, db_column='ContractName') # Field name made lowercase.
  class Meta:
    db_table = 'txn_contracts'

如何在setup方法中创建用于单元测试的对象?我试过了

self.parentOrg = Parentorgs.objects.create(parentorg_id = 300, 
    parentorg = "TestParentOrgOne", eff_date = timezone.now(), exp_date = None)
self.contracts = Contracts.objects.create(parentorg_id = self.parentOrg, 
    contractnum = "1234", eff_date = timezone.now(), exp_date = None, 
    contractname = "testContractName")

这在创建contracts对象时出错,因为我收到unknown column 'parentorg_id_id' in field list错误。

如何在此处创建具有适当关系的parentOrgcontracts个对象?

1 个答案:

答案 0 :(得分:0)

ForeignKey是一个关系字段,会自动映射ID,因此您的模型应如下所示:

class Contracts(models.Model):
  parentorg = models.ForeignKey(Parentorgs)
  ...

这种关系是这样创造的:

 Contracts.objects.create(parentorg = self.parentOrg, ...)

这会将列parentorg_id设置为id的{​​{1}}。

关于代码的其他一些(可能是不相关的)评论:

  • 模型类名称通常是单数,即self.parentOrg而不是Contact,因为实例是一个合同。
  • 您无需手动设置主键 - 除非您确实想要控制主键的使用方式,否则Contracts中的parentorg_id字段是不必要的。