Получение «не существует или является ошибкой m2m» на моем uuid (первичный ключ) при попытке сохранить в DRF

Я написал свой собственный объем save() потому что я не могу получить метод internal save() ListSerializer для вызова соответствующего метода ( create() & update() ) в зависимости от полезной нагрузки запроса. Модель называется Product , основным ключом которого является uuid . Когда я вызываю связанный с продуктом метод save() с обновленным kwarg, я получаю:

ValueError: в этой модели не существуют следующие поля или поля m2m: uuid

Вот save() :

 def save(self): instances = [] result = [] # Note self.validated_data is a list of multiple OrderedDicts representing # the json of Product fields. Depending on the request, they will either # have uuids (so we will update these instances), or won't and hence # require creation. for obj in self.validated_data: uuid = obj.get('uuid', None) if uuid: instance = get_object_or_404(Product, uuid=uuid) update_fields = [k for k,v in obj.items()] for k, v in obj.items(): setattr(instance, k, v) instance.save(update_fields=update_fields) result.append(instance) else: instances.append(Product(**obj)) Product.objects.bulk_create(instances) result += instances return result 

Вот соответствующая хвостовая часть трассировки:

Файл «/my/app/views/API/product.py», строка 162, в partial_update serializer.save ()

Файл «/my/app/views/API/serializers.py», строка 72, в save update_fields = [k для k, v в obj.items ()]

Файл «/lib/python3.5/site-packages/django/db/models/base.py», строка 792, в save% ',' .join (non_model_fields))

ValueError: в этой модели не существуют следующие поля или поля m2m: uuid

Ниже приведена соответствующая часть определения Product :

 class Product(models.Model): uuid = models.UUIDField(primary_key=True, default=uuid.uuid4) 

Таким образом, это не m2m, и это поле действительно существует. В чем причина этой ошибки?

One Solution collect form web for “Получение «не существует или является ошибкой m2m» на моем uuid (первичный ключ) при попытке сохранить в DRF”

Ошибка возникает из этой строки, где Django сравнивает update_fields вы предоставили с полями Model.

  if non_model_fields: raise ValueError("The following fields do not exist in this " "model or are m2m fields: %s" % ', '.join(non_model_fields)) 

К сожалению, сообщение об ошибке немного вводит в заблуждение, потому что все поля с primary_key=True (например, ваше поле uuid ) отфильтрованы , кроме m2m .

  update_fields = frozenset(update_fields) field_names = set() for field in self._meta.fields: if not field.primary_key: field_names.add(field.name) ... non_model_fields = update_fields.difference(field_names) 

Вот почему non_model_fields не пустые, и возникает исключение.

Чтобы устранить проблему, вам нужно избавиться от ключа uuid из obj перед сохранением.

  ... obj.pop('uuid') # only if mutating validated_data doesn't bother you update_fields = [k for k,v in obj.items()] for k, v in obj.items(): setattr(instance, k, v) instance.save(update_fields=update_fields) result.append(instance) 

BTW вам не нужно это понимание списка, чтобы получить update_fields – вы можете использовать obj.keys() который дает тот же результат.

  • IntegrityError в django rest framework
  • Почему эта документация API django-rest-swagger API не будет отображаться / работать правильно?
  • DRF 3 - Создание много-ко-многим обновлений / создания сериализатора с помощью таблицы
  • Как ограничить результаты запроса фильтрами Django Rest
  • Как проверить конечную точку API с помощью Django-rest-framework, используя Django-oauth-toolkit для аутентификации
  • OperationalError, нет такого столбца. Джанго
  • Как опубликовать в API-интерфейсе Django REST Framework с помощью связанных моделей
  • Как кэшировать вызовы API Django Rest Framework?
  • Бизнес-логика Django Rest Framework
  • Django Rest Framework ModelSerializer Установить атрибут для создания
  • как добавить аннотационные данные в ответы на запрос ответа django-rest-framework?
  • Python - лучший язык программирования в мире.