Nano Hash - криптовалюты, майнинг, программирование

Как создать новую запись из набора запросов django

Я где-то слышал о взломе django orm. Это происходит так

dp = SomeModel.objects.filter(type="customer").last()
dp.id = dp.id + 1 #changing id to a new one
dp.save() 

Последний шаг предположительно создает новую запись, если используемое значение идентификатора не существует. В случае существования увеличенного идентификатора метод сохранения действует как метод обновления. пример ::

dp.version += 1 #updating some random field
dp.save() # will change the newer version of dp.id

Я хотел бы задать ветеранам джанго два вопроса для нашей пользы,

  1. Есть ли надежный способ создания новой записи из старой записи с последним auto_increment_pk вместо метода pk + 1
  2. Вышеупомянутый метод быстрее или лучше. Я вижу одно преимущество: если у меня есть модель с 10 полями, и я хочу создать новую запись из старой только с 1 или 2 изменениями по сравнению со старой, этот метод экономит 8 строк кода.

Благодарю вас

23.01.2018

  • Как говорится в обоих ответах, использование None предпочтительнее использования +1. С помощью +1 можно перезаписать существующую строку либо из-за состояния гонки, либо из-за того, что исходный набор запросов может быть не упорядочен по pk, либо из-за того, что модель может использовать схему первичного ключа, отличную от используемой по умолчанию. 23.01.2018

Ответы:


1

Да, сделайте id равным None.

dp = SomeModel.objects.filter(type="customer").last()
dp.id = None
dp.save()
23.01.2018
  • Спасибо за ответ, я проверил, и это работает отлично. Отметив свой как ответ. 23.01.2018

  • 2

    last() возвращает последний экземпляр в соответствии с порядком QuerySet. Не гарантируется, что этот экземпляр будет иметь самый большой используемый pk. И если бы это было так, не было бы никакой гарантии, что не будет создан другой экземпляр между получением старого наивысшего pk и фиксацией нового экземпляра с помощью pk + 1. Такой экземпляр будет перезаписан новым клоном. Следовательно, не устанавливайте новый pk вручную, а позвольте базе данных справиться с этим. Как предлагали другие, это легко сделать, установив для pk значение None:

    instance.pk = None
    instance.save()
    
    23.01.2018
  • Принято. Другой способ - сделать фильтр для всех. затем упорядочить по идентификатору в порядке убывания. Но предостережение в том, что мы должны делать все это в транзакции... что является плохой практикой, по крайней мере, здесь. Спасибо за подробное объяснение. 23.01.2018

  • 3

    Вместо того, чтобы увеличивать pk, вы должны установить его в None. Тогда он всегда будет сохраняться как новая запись.

    23.01.2018
  • оба дали правильный ответ. Но поскольку @itzMEonTV дал код, я принимаю его ответ. Однако я проголосовал за ваш ответ. Большое спасибо. 23.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..