Django - переменная удаляется сама перед созданием объекта? - PullRequest
0 голосов
/ 27 февраля 2019

Рассмотрим этот фрагмент :

if fire_prim is not None:
    print('Fire Primary is definitely not Null, here is proof: {}'.format(fire_prim))
    fire_primary_obj = LifeSafety.objects.create(
        name='Fire Primary', 
        store=store_obj, 
        phone_line=fire_prim, 
        phone_line_provider=an_provider)

Мы получаем следующее output :

Fire Primary is definitely not Null, here is proof: +16077244546
Traceback (most recent call last):
  File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Python\lib\site-packages\django\db\backends\sqlite3\base.py", line 298, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: stores_lifesafety.phone_line

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\admin-dksc104694\Desktop\Dev\it-database\scripts\data.py", line 246, in update_lifesafety_devices
    fire_primary_obj = LifeSafety.objects.create(name='Fire Primary', store=store_obj, phone_line=fire_prim, phone_line_provider=an_provider)
  File "C:\Python\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Python\lib\site-packages\django\db\models\query.py", line 413, in create
    obj.save(force_insert=True, using=self.db)
  File "C:\Python\lib\site-packages\django\db\models\base.py", line 718, in save
    force_update=force_update, update_fields=update_fields)
  File "C:\Python\lib\site-packages\django\db\models\base.py", line 748, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "C:\Python\lib\site-packages\django\db\models\base.py", line 831, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "C:\Python\lib\site-packages\django\db\models\base.py", line 869, in _do_insert
    using=using, raw=raw)
  File "C:\Python\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Python\lib\site-packages\django\db\models\query.py", line 1136, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:\Python\lib\site-packages\django\db\models\sql\compiler.py", line 1289, in execute_sql
    cursor.execute(sql, params)
  File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 100, in execute
    return super().execute(sql, params)
  File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Python\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Python\lib\site-packages\django\db\backends\sqlite3\base.py", line 298, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: stores_lifesafety.phone_line

Мы можем видеть со 100% уверенностьючто строка непосредственно перед созданием объекта, fire_prim имеет значение +16077244546, которое должно служить phone_line, но к тому моменту, когда она доходит до создания, она как-то удаляется.

Вот мой модель для справки:

class LifeSafety(models.Model):
    name = models.CharField(max_length=40, default='unspecified')
    store = models.ForeignKey(Store, null=True, on_delete=models.SET_NULL)
    phone_line = PhoneNumberField()
    phone_line_provider = models.ForeignKey(Provider, null=True, on_delete=models.SET_NULL)
    last_verification = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

Предварительный вопрос:

  • Я разрешил Нуль на объектеи оставил код для запуска, и неудивительно, что объекты созданы, но phone_line пусто.
  • Я использую библиотеку PhoneNumberField .
  • Я могу "издеваться"этот точный код из оболочки и объекта каждый раз создается с правильным значением.
  • Фрагмент выше точно такой, как показано, между печатью fire_prim и попыткой создания ничего нет.

Пост-вопрос:

  • Изменено phone_line на CharField вместо PhoneNumberField и номер телефона проходит очень хорошо.Я открываю вопрос об их Github Repo .
  • Явно использовал строку как phone_line при создании экземпляра.
  • Проверено еще разчто это можно сделать из оболочки без проблем.

    Ввод: LifeSafety.objects.create (name = 'Fire Primary', store = store, phone_line = '+ 16077244546')

    Вывод: LifeSafety: Fire Primary (с указанием QuerySet)


Интересно, когда я использую строку явно при создании, объект создаетс phone_line, заполненным этой строкой, но я все еще получаю ошибку.

Ввод:

    print('Fire Primary is definitely not Null, here is proof: {}'.format(fire_prim))

    fire_primary_obj = LifeSafety.objects.create(
        name = 'Fire Primary', 
        store = store_obj, 
        phone_line = '+16077244546', 
        phone_line_provider = an_provider
    )

Выход - тот же стекtrace как указано выше (только различия в именах в diff checker).

Я могу зайти в admin и увидеть, что он был создан, но я все еще получаю исключение NOT NULL constraint.

enter image description here

...