• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Django, problem z migracją modeli

Object Storage Arubacloud
0 głosów
381 wizyt
pytanie zadane 26 października 2018 w Python przez Sheida Użytkownik (950 p.)

Witam. Podczas przeprowadzania migracji zaaktulizowanego modelu dostaję taki oto błąd

Operations to perform:
  Apply all migrations: admin, agreements, auth, contenttypes, core, sessions
Running migrations:
  Applying core.0006_auto_20181025_2357...Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/core/management/base.py", line 335, in execute
    output = self.handle(*args, **options)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 200, in handle
    fake_initial=fake_initial,
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/migrations/migration.py", line 122, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/migrations/operations/fields.py", line 84, in database_forwards
    field,
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/backends/sqlite3/schema.py", line 306, in add_field
    self._remake_table(model, create_field=field)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/backends/sqlite3/schema.py", line 178, in _remake_table
    self.effective_default(create_field)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 240, in effective_default
    default = field.get_db_prep_save(default, self.connection)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 767, in get_db_prep_save
    return self.get_db_prep_value(value, connection=connection, prepared=False)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 762, in get_db_prep_value
    value = self.get_prep_value(value)
  File "/home/sheida/Programs/venv/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1826, in get_prep_value
    return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'

Nie za bardzo rozumiem dlaczego taki błąd wyskakuje. W modelu nie mam pola, którego wartość mógłby wybierać ze wcześniej utworzonych tupli.

To jest kod modelu:

from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    person_id = models.CharField(unique=True, blank=True, max_length=11)

    business_id = models.CharField(unique=True, blank=True, max_length=9)

    email = models.EmailField(unique=True)
    business = models.BooleanField()

 

komentarz 26 października 2018 przez adrian17 Ekspert (344,860 p.)
Jak się zmienił model? Pokażesz też wygenerowaną migrację?
komentarz 26 października 2018 przez Sheida Użytkownik (950 p.)
W jaki sposób mogę to pokazać?
komentarz 26 października 2018 przez adrian17 Ekspert (344,860 p.)
Zmianę modelu możesz opisać... słownie? Albo diff? Commit gita?

Wygenerowana migracja to plik w katalogu migrations, 0006_auto_20181025_2357
komentarz 26 października 2018 przez Sheida Użytkownik (950 p.)

Na początku chciałem, aby personal_id był IntegerFieldem, który wybierałby z tupli ilość liczb oraz nazwę identyfikatora (np ((11, 'PESEL'),). Doszedłem jednak do wniosku, że lepiej będzie jak te pole będzie CharFieldem bez możliwości wyboru (postanowiłem, że będzie to tylko polskie). W tym miejscu dostałem błąd.

# Generated by Django 2.0.8 on 2018-10-25 22:08

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('core', '0010_auto_20181026_0006'),
    ]

    operations = [
        migrations.AddField(
            model_name='user',
            name='business_id',
            field=models.CharField(blank=True, max_length=9, unique=True),
        ),
        migrations.AddField(
            model_name='user',
            name='person_id',
            field=models.CharField(blank=True, max_length=11, unique=True),
        ),
    ]

To jest ostatnie udane makemigrations

 

Jeśli chodzi o 6 plik, to jest kod

# Generated by Django 2.0.8 on 2018-10-25 21:57

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('core', '0005_auto_20181022_1821'),
    ]

    operations = [
        migrations.AddField(
            model_name='user',
            name='national_business_id',
            field=models.IntegerField(blank=True, choices=[(9, 'REGON')], default=(9, 'REGON'), unique=True),
        ),
        migrations.AddField(
            model_name='user',
            name='national_person_id',
            field=models.IntegerField(blank=True, choices=[(11, 'PESEL')], default=(11, 'PESEL'), unique=True),
        ),
    ]

 

1 odpowiedź

0 głosów
odpowiedź 26 października 2018 przez adrian17 Ekspert (344,860 p.)

No to łatwo widać, co się stało.

        migrations.AddField(
            model_name='user',
            name='national_business_id',
            field=models.IntegerField(blank=True, choices=[(9, 'REGON')], default=(9, 'REGON'), unique=True),
        ),

Stworzyłeś pole typu IntegerField, a jako domyślną wartość ustawiłeś `(9, 'REGON')`, co nie ma sensu za bardzo.

(swoją drogą, to trochę dziwne że jesteś już na 11tej migracji, a dopiero teraz uruchamiasz 6tą)

komentarz 26 października 2018 przez Sheida Użytkownik (950 p.)
Jak mogę to naprawić? Sam nie rozumiem za bardzo działań Django. Uczę się dopiero tego frameworka.
komentarz 26 października 2018 przez adrian17 Ekspert (344,860 p.)
Skoro tylko bawiłeś się z modelem i tak naprawdę nie robiłeś migracji, to usuń te wszystkie tymczasowe śmieciowe niewykonane pliki migracji; potem odpal makemigrations jeszcze raz i dostaniesz jedną migrację bezpośrednio od wcześniejszego stanu bazy do nowego.

Podobne pytania

0 głosów
1 odpowiedź 475 wizyt
pytanie zadane 27 maja 2018 w Python przez Antybuka Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 235 wizyt
0 głosów
1 odpowiedź 128 wizyt

92,550 zapytań

141,392 odpowiedzi

319,520 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...