Я пытаюсь сделать POST с помощью следующей Serializer -Исключение Значение: Невозможно назначить «786»: «Varmst.owner_id» должен быть «Владелец» экземпляр
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
При попытке POST данные, которые он дает следующее сообщение об ошибке -
Exception Type: ValueError at /deploy/variable/
Exception Value: Cannot assign "786": "Varmst.owner_id" must be a "Owner" instance.
Varmst.owner_id является ссылкой FK для Owner.owner_id и я проверил БД и это значение (786) действительно существует, так что я не знаю, почему передавая его в сериализатором заставляет его потерпеть неудачу.
Полный Traceback ниже -
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'
Пожалуйста, покажите свои модели. Но если ваши слова точны, сообщение об ошибке является действительным. * Varmst.owner_id - это ссылка FK на Owner.owner_id. * Внешние поля ключа указывают на экземпляры, а не целые идентификаторы. Если 'owner_id' является (плохо названным) полем' ForeignKey', то это экземпляр, а 'owner_id_id' является фактическим значением целочисленного идентификатора, хранящимся в базе данных. –
Thnx Я подтвердил ваш вопрос. Если я изменю модель на IntegerField вместо ForeignKey, она работает так, что проблема связана с передачей целого числа в поле FK, поэтому вопрос заключается в том, как это сделать, потому что, если я делаю запрос обновления к БД, число является числом число. – whoisearth
Измените свое поле на 'owner = models.ForeignKey (Owner)'. Django автоматически использует 'owner_id' в качестве поля базы данных для целочисленного идентификатора FK. Затем вы можете использовать его так же, как любое другое поле, например. 'varmst_instance.owner_id = 786'. –