关于这个主题有很多关于SO的相关问题,但它们似乎都处理了被分配的元素实际上是instance.id
或具有实例名称的字符串的情况。
我有两个模型,一个名为Photo
,另一个名为Material
。
class Photo(models.Model):
mat = models.ForeignKey(
Material, related_name='photos',null=True, blank=True)
在shell中,我得到一个Photo
对象,并创建一个Material
对象。
[in : 1]p = Photo.objects.all()[0] # get the first
[in : 2]m, bool = Material.objects.get_or_create(id=1) # get_or_create returns a tuple, take the first
[in : 3]p
[out:1] <Photo: Photo object>
[in : 4]m
[out:2] <Material:Material object>
[in : 5]p.mat = m
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-60-836d23304359> in <module>()
----> 1 p.mat = m
/home/rootadmin/opensurfaces/venv/local/lib/python2.7/site-packages/django/db/models/fields/related.pyc in __set__(self, instance, value)
595 instance._meta.object_name,
596 self.field.name,
--> 597 self.field.rel.to._meta.object_name,
598 )
599 )
ValueError: Cannot assign "<Material: Material object>": "Photo.mat" must be a "Material" instance.
据我所知,m
是Material
个实例。出了什么问题?
答案 0 :(得分:0)
当您尝试分配instance.id而不是实例时,通常会出现此错误 在django中,您需要为所有ForeignKey字段设置一个实例 实例Ex:
mat = Material.objects.all()[0]
答案 1 :(得分:0)
您可以查看材料模型如何导入文件并确保它与PhotoK的ForeignKey模型相同吗?您似乎导入了错误的Material类。
答案 2 :(得分:0)
元素m
是一个实际的Material
实例。这并不意味着它是正确的 Material
实例。
就我而言,事实证明,有一个名为Material
的类有两个单独的声明。结果,我试图分配错误的Material
实例。