Почему я получаю сообщение «ошибка сериализации» при попытке перенести модель? - PullRequest
0 голосов
/ 17 апреля 2020

Ну, я очень плохо знаком с django, поэтому я легко заблудился. Я пытаюсь построить свою модель, используя мою sql модель в качестве эталона (я полагаю, что так люди и делают). Я решил большинство ошибок, но последняя убивает меня, и я не могу найти помощь по net. Это мой код:

from phone_field import PhoneField

# Create your models here.


class Room(models.Model):
    number = models.IntegerField(primary_key=True, unique=True)
    duration = models.IntegerField(default="3")
    max_score = models.IntegerField(default="100")
    name = models.CharField(max_length=30)
    status = models.CharField(max_length=15, default="inactive")


class Credit(models.Model):
    value = models.CharField(max_length=3)


class Language(models.Model):
    name = models.CharField(max_length=20, default="chinese")


class Token(models.Model):
    token_id = models.IntegerField(primary_key=True, unique=True)


class Level(models.Model):
    value = models.IntegerField(default="1")


class Event(models.Model):
    name = models.CharField(max_length=80)
    phone_number = PhoneField(blank=True, help_text='Contact phone number')
    date = models.DateTimeField('date of event')
    members = models.IntegerField()
    credit = models.ForeignKey(Credit, on_delete=models.DO_NOTHING)
    language = models.ForeignKey(Language, on_delete=models.SET_DEFAULT, default="chinese")
    level = models.ForeignKey(Level, on_delete=models.SET_DEFAULT, default="1")


class Team(models.Model):
    name = models.CharField(max_length=80)
    token_id = models.ForeignKey(Token, blank=True, null=True,on_delete=models.SET_NULL)
    event_id = models.ForeignKey(Event, on_delete=models.CASCADE)
    language = models.ForeignKey(Language, on_delete=models.SET_DEFAULT, default=Event.language)
    level = models.ForeignKey(Level, on_delete=models.SET_DEFAULT, default=Event.level)
    players_number = models.IntegerField(default="3")
    end_time = models.DateTimeField()
    activation_status = models.BooleanField(default=True)
    active_room = models.ForeignKey(Room, blank=True, null=True,on_delete=models.SET_NULL)
    total_score = models.IntegerField(default="0")


class ScoreTable(models.Model):
    team_id = models.ForeignKey(Team,blank=True, null=True, on_delete=models.CASCADE)
    room_number = models.ForeignKey(Room, blank=True, null=True,on_delete=models.CASCADE)
    score = models.IntegerField(default="0")
    time = models.DateTimeField('time of scoring', auto_now_add=True)


class BestScore(models.Model):
    team_name = models.CharField(max_length=80)
    total_score = models.IntegerField(default="0")
    date = models.DateTimeField()

Когда я пытаюсь перенести мою модель, я получаю эту ошибку:

(mysite) MBPdeAlexandre:mysite nivren$ python manage.py makemigrations manager
Migrations for 'manager':
  manager/migrations/0001_initial.py
    - Create model BestScore
    - Create model Credit
    - Create model Event
    - Create model Language
    - Create model Level
    - Create model Room
    - Create model Token
    - Create model Team
    - Create model ScoreTable
    - Add field language to event
    - Add field level to event
Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/core/management/base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/core/management/base.py", line 369, in execute
    output = self.handle(*args, **options)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py", line 182, in handle
    self.write_migration_files(changes)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py", line 219, in write_migration_files
    migration_string = writer.as_string()
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/writer.py", line 141, in as_string
    operation_string, operation_imports = OperationWriter(operation).serialize()
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/writer.py", line 99, in serialize
    _write(arg_name, arg_value)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/writer.py", line 51, in _write
    arg_string, arg_imports = MigrationWriter.serialize(item)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/writer.py", line 271, in serialize
    return serializer_factory(value).serialize()
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/serializer.py", line 37, in serialize
    item_string, item_imports = serializer_factory(item).serialize()
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/serializer.py", line 199, in serialize
    return self.serialize_deconstructed(path, args, kwargs)
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/serializer.py", line 86, in serialize_deconstructed
    arg_string, arg_imports = serializer_factory(arg).serialize()
  File "/Users/nivren/.virtualenvs/mysite/lib/python3.8/site-packages/django/db/migrations/serializer.py", line 336, in serializer_factory
    raise ValueError(
ValueError: Cannot serialize: <django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor object at 0x10a7d5310>
There are some values Django cannot serialize into migration files.
For more, see https://docs.djangoproject.com/en/3.0/topics/migrations/#migration-serializing

ОК, у меня есть внешний ключ "language", на который ссылается " Команда "и" событие ", и" событие "также упоминается в" команда ". Мне это показалось ясным: событие может быть настроено на языке, но одна из команд, участвующих в этом событии, может перегружать выбор языка, всегда выбирая из списка языков. Есть ли что-то, чего я не понял в философии модели django? Спасибо за помощь, а пока продолжу искать ответы :)

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

ОК, я нашел свою проблему. Я говорил, что если язык для «команды» удален, то он должен использовать значение языка из «события». Django это не нравится. Я не знаю почему, но это вызывает проблемы. Теперь, когда я поставил реальное значение по умолчанию, он принимает мою миграцию. Если кто-то может объяснить мне в комментарии, было бы здорово:)

0 голосов
/ 17 апреля 2020

Я думаю, что проблема в ваших моделях, в частности PhoneModel. Вы используете неправильно для реализации валидатора. Обратитесь к этой ссылке, чтобы понять валидатор: https://docs.djangoproject.com/en/3.0/ref/validators/#writing -validators

Ваш код должен выглядеть так:

phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be: '+999999999'. Max 15 digits.")
class PhoneModel(models.Model):
    phone_number = models.CharField(validators=[phone_regex], max_length=17, blank=True)  # validators should be a list

, также вы можете реализовать его следующим образом:

class ReceiverForm(forms.ModelForm):
    phone_number = forms.RegexField(regex=r'^\+?1?\d{9,15}$', 
                                error_message = ("Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed."))

Поправьте меня, это не работает

...