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

Django, problem z migracją modeli

VPS Starter Arubacloud
0 głosów
363 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,100 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,100 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,100 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,100 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ź 469 wizyt
pytanie zadane 27 maja 2018 w Python przez Antybuka Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 225 wizyt
0 głosów
1 odpowiedź 126 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...