在通过shell在Django中创建新模型实例时,使用Model的id(主键)作为ForeignKey

时间:2014-03-19 09:27:10

标签: django python-3.x django-models

为了便于说明,只有两个简单的模型:

class PrimaryModel(models.Model):
    foo = models.CharField(max_length=50, unique=True)

class SecondaryModel(models.Model):
    bar = models.ForeignKey(PrimaryModel)

现在尝试在shell中创建实例:

>>> import testapp.models
>>> a=testapp.models.PrimaryModel(foo="Test1")
>>> a.save()
>>> b=testapp.models.SecondaryModel(bar=1)

......当然还有错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/pkaramol/Workspace/django-env/lib/python3.3/site-packages/django/db/models/base.py", line 405, in __init__
    setattr(self, field.name, rel_obj)
  File "/home/pkaramol/Workspace/django-env/lib/python3.3/site-packages/django/db/models/fields/related.py", line 337, in __set__
    self.field.name, self.field.rel.to._meta.object_name))
ValueError: Cannot assign "1": "SecondaryModel.bar" must be a "PrimaryModel" instance.

问题是为什么我们不能使用PrimaryModel的id(如上面的错误示例),我们必须使用实例? 还尝试使用

中的to_field字段
class SecondaryModel(models.Model):
    bar = models.ForeignKey(PrimaryModel, to_field='foo')

但这并没有改变这种情况。

2 个答案:

答案 0 :(得分:3)

如果你想使用PrimaryModel的id,你应该这样做:

b=testapp.models.SecondaryModel(bar_id=1)

答案 1 :(得分:2)

这个怎么样。

>>> import testapp.models
>>> a=testapp.models.PrimaryModel(foo="Test1")
>>> a.save()
>>> b=testapp.models.SecondaryModel()
>>> b.bar_id = 1
>>> b.save()

实际上,只需将_id添加到外键名称即可访问fk id。只需创建模型,然后手动设置fk_id,然后保存