分配该特定实例时,“无法分配必须是实例”

时间:2018-05-02 11:39:11

标签: python django

关于这个主题有很多关于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.

据我所知,mMaterial个实例。出了什么问题?

3 个答案:

答案 0 :(得分:0)

当您尝试分配instance.id而不是实例时,通常会出现此错误 在django中,您需要为所有ForeignKey字段设置一个实例 实例Ex:

mat = Material.objects.all()[0]

答案 1 :(得分:0)

您可以查看材料模型如何导入文件并确保它与PhotoK的ForeignKey模型相同吗?您似乎导入了错误的Material类。

答案 2 :(得分:0)

元素m是一个实际的Material实例。这并不意味着它是正确的 Material实例。

就我而言,事实证明,有一个名为Material的类有两个单独的声明。结果,我试图分配错误的Material实例。