Django 异常值:无法分配“786”:“Varmst.owner\u id”必须是“owner”实例

Django 异常值:无法分配“786”:“Varmst.owner\u id”必须是“owner”实例,django,django-rest-framework,Django,Django Rest Framework,我正在尝试使用以下序列化程序发布帖子- class VariablePUTSerializer(serializers.ModelSerializer): owner_id = serializers.SerializerMethodField('get_owner_id') class Meta: model = Varmst resource_name = 'varmst' fields = ('varmst_id', 'va

我正在尝试使用以下序列化程序发布帖子-

class VariablePUTSerializer(serializers.ModelSerializer):
    owner_id = serializers.SerializerMethodField('get_owner_id')

    class Meta:
        model = Varmst
        resource_name = 'varmst'
        fields = ('varmst_id', 'varmst_type', 'varmst_name', 'varmst_value', 'varmst_desc',
                'varmst_public', 'owner_id', 'varmst_lstchgtm', 'varmst_publish', 'varmst_readonly',
                'varmst_calc', 'varmst_starttype', 'varmst_startdt', 'varmst_startcal',
                'varmst_offsets', 'varmst_lstval')

    def transform_varmst_id(self, obj, value):
        maxid = Varmst.objects.latest('varmst_id').varmst_id
        if Varmst.objects.filter(varmst_name=obj.varmst_name).exists():
            obj.varmst_id = Varmst.objects.filter(varmst_name=obj.varmst_name).values_list('varmst_id')[0]
            return obj.varmst_id
        else:
            obj.varmst_id = maxid + 1
            return obj.varmst_id

    def get_owner_id(self, obj):
        obj.owner_id = Owner.objects.filter(owner_name='Operations').values_list('owner_id')[0][0]
        return obj.owner_id
在尝试发布数据时,会出现以下错误-

Exception Type: ValueError at /deploy/variable/
Exception Value: Cannot assign "786": "Varmst.owner_id" must be a "Owner" instance.
Varmst.owner_id是对owner.owner_id的FK引用,我已经检查了DB,并且值786确实存在,所以我不确定为什么将它传递到序列化程序会导致它失败

完全回溯如下-

Traceback:
File "D:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Python27\lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "D:\Python27\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "D:\Python27\lib\site-packages\rest_framework\views.py" in dispatch
  400.             response = self.handle_exception(exc)
File "D:\Python27\lib\site-packages\rest_framework\views.py" in dispatch
  397.             response = handler(request, *args, **kwargs)
File "D:\Tidal\API\views.py" in put
  343.             return HttpResponse(serializer.data, status=status.HTTP_201_CREATED)
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in data
  573.                 self._data = [self.to_native(item) for item in obj]
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in to_native
  351.             value = field.field_to_native(obj, field_name)
File "D:\Python27\lib\site-packages\rest_framework\fields.py" in field_to_native
  1035.         value = getattr(self.parent, self.method_name)(obj)
File "D:\Tidal\API\serializers.py" in get_owner_id
  162.         obj.owner_id = Owner.objects.filter(owner_name='Operations').values_list('owner_id')[0][0]
File "D:\Python27\lib\site-packages\django\db\models\fields\related.py" in __set__
  339.                                  self.field.name, self.field.rel.to._meta.object_name))

Exception Type: ValueError at /deploy/variable/
Exception Value: Cannot assign "786": "Varmst.owner_id" must be a "Owner" instance.
这是我的模型-

class Owner(models.Model):
    owner_id = models.IntegerField(primary_key=True, db_column='owner_id')
    owner_type = models.SmallIntegerField(blank=True, null=True)
    owner_name = models.CharField(max_length=30, blank=True)
    owner_allagents = models.CharField(max_length=1, blank=True) 
    class Meta:
        managed = False
        db_table = 'owner'

class Varmst(models.Model):
    varmst_id = models.IntegerField(primary_key=True, db_column='varmst_id')
    varmst_type = models.SmallIntegerField(blank=True, null=True)
    varmst_name = models.CharField(max_length=30, blank=True)
    varmst_value = models.TextField(blank=True)
    varmst_desc = models.TextField(blank=True)
    varmst_public = models.CharField(max_length=1, blank=True)
    owner_id = models.ForeignKey(Owner, db_column='owner_id')
    class Meta:
        managed = False
        db_table = 'varmst'

由Kevin Christopher Henry根据以下内容解决-


如果您指定字段所有者,则db_列将自动成为所有者id。如果需要的话,可以对db_列进行明确说明,但不能将字段命名为owner_id。否则,您将无法区分Django模型实例和整数id。

请显示您的模型。但是如果你的话是准确的,错误信息是有效的。Varmst.owner_id是对owner.owner_id的FK引用。外键字段指向实例,而不是整数id。如果owner\u id是一个名称不正确的ForeignKey字段,那么这就是实例,owner\u id\u id是存储在数据库中的实际整数id值。如果我将模型更改为IntegerField而不是ForeignKey,那么它会起作用,因此问题在于将整数传递到FK字段中,因此问题是如何执行此操作,因为如果我对DB进行更新查询,a number is a number is a number is number。将字段更改为owner=models.ForeignKeyOwner。Django将自动使用owner_id作为FK整数id的数据库字段。然后,您可以像使用任何其他字段一样使用它,例如varmst_instance.owner_id=786。这是一个遗留数据库:我还更新了模型,它实际上是owner_id=models.ForeignKeyOwner,DB_column='owner_id',如果您命名字段所有者,那么DB_列将自动成为owner_id。如果需要的话,可以直接对db_列进行说明,但不能将字段命名为owner_id。否则,您将无法区分Django模型实例和整数id。