Получение «не существует или является ошибкой 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() который дает тот же результат.

  • Django DRF с oAuth2 с использованием DOT (django-oauth-toolkit)
  • Создайте вложенный сериализатор с Django Rest Framework, но без первичных ключей как идентификатор
  • упорядочение с использованием синтаксиса SQL CASE WHEN / THEN django
  • Django REST Framework Сериализация ForeignKey и ManyToManyFields
  • Post API с использованием Token из заголовка
  • Передавайте дополнительные данные при регистрации пользователя с помощью Djoser и Django Rest Framework
  • Django Rest Framework - получить связанное поле модели в сериализаторе
  • Django Rest Framework записываемые вложенные сериализаторы
  •  
    Interesting Posts for Van-Lav

    Что делает ключевое слово «yield»?

    Необходимо избегать взаимоблокировки подпроцесса без связи

    Как найти шаблон в изображении с помощью маски (или прозрачности) с помощью OpenCV и Python?

    Странное поведение для аннотата в Django

    В django, как мне вызвать подкоманду syncdb из сценария инициализации?

    Как опустить значения переменных на Sphinx?

    Ошибка при запуске «python manage.py syncdb» локально, но без ошибок при выполнении той же команды через Heroku

    Flask – доступ к переменной конфигурации в шаблоне

    скрипт загрузки или модуль загрузки

    Python попытается, наконец, вернуть блок

    Python: индексы кортежей должны быть целыми, а не str при выборе из таблицы mysql

    App Engine OAuth2.0 разрешил работу cron для анализа Google Sheet

    Невозможно импортировать GST в Python

    Как умножить скаляр на конкретный столбец в массиве NumPy?

    Как получить учетные данные Google Analytics без gflags – вместо этого используйте run_flow ()?

    Python - лучший язык программирования в мире.