2014-09-17 3 views
0

Я пытаюсь сделать 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' 
+1

Пожалуйста, покажите свои модели. Но если ваши слова точны, сообщение об ошибке является действительным. * Varmst.owner_id - это ссылка FK на Owner.owner_id. * Внешние поля ключа указывают на экземпляры, а не целые идентификаторы. Если 'owner_id' является (плохо названным) полем' ForeignKey', то это экземпляр, а 'owner_id_id' является фактическим значением целочисленного идентификатора, хранящимся в базе данных. –

+0

Thnx Я подтвердил ваш вопрос. Если я изменю модель на IntegerField вместо ForeignKey, она работает так, что проблема связана с передачей целого числа в поле FK, поэтому вопрос заключается в том, как это сделать, потому что, если я делаю запрос обновления к БД, число является числом число. – whoisearth

+0

Измените свое поле на 'owner = models.ForeignKey (Owner)'. Django автоматически использует 'owner_id' в качестве поля базы данных для целочисленного идентификатора FK. Затем вы можете использовать его так же, как любое другое поле, например. 'varmst_instance.owner_id = 786'. –

ответ

0

решил Кевин Кристофер Генри, как в следующем -

Если имя владельца поля затем db_column будет owner_id, автоматически. Не стесняйтесь быть явным о db_column, если хотите, но назовите поле ничего, кроме owner_id. В противном случае вы теряете возможность различать экземпляр модели Django и целочисленный идентификатор.

Смежные вопросы