TypeError: требуется целое число (получен тип str) при выполнении миграций или тестов

Я модифицировал существующую модель следующим образом:

Изначально было так

class AppAssessment(models.Model):
    contact_uuid = models.CharField(max_length=255)
    step = models.IntegerField(null=True)
    optionId = models.IntegerField(null=True, blank=True)
    user_input = models.TextField(null=True, blank=True)
    title = models.TextField(null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return (
            f"UUID: {self.contact_uuid} | Step: {self.step} | OptionID: {self.optionId} \n"
            f"| User_Input: {self.user_input} | Title: {self.title} \n"
            f"| Created_at: {self.created_at}"
                        
        )

Но я изменил contact_uuid на contact_id и изменил тип модели:

class AppAssessment(models.Model):
    contact_id = models.UUIDField()
    step = models.IntegerField(null=True)
    optionId = models.IntegerField(null=True, blank=True)
    user_input = models.TextField(null=True, blank=True)
    title = models.TextField(null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return (
            f"UUID: {self.contact_id} | Step: {self.step} | OptionID: {self.optionId} \n"
            f"| User_Input: {self.user_input} | Title: {self.title} \n"
            f"| Created_at: {self.created_at}"
                        
        )

В файле views.py я уже хранил записи в виде строк

        store_url_entry = AppAssessment(contact_uuid=contact_uuid, title=title, description=description, step=step, user_input=value, optionId=optionId)
        store_url_entry.save()

Я удалил базу данных и создал ее заново, но она по-прежнему не работает. Я также перезапустил виртуальную среду, но это не помогло.

Ошибка, которую я вижу, заключается в следующем:

Файл миграции для app.0021_auto_20220413_0328:

# Generated by Django 2.2.20 on 2022-04-13 03:28

from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

    dependencies = [
        ('app', '0020_auto_20220411_1610'),
    ]

    operations = [
        migrations.RemoveField(
            model_name='appassessment',
            name='contact_uuid',
        ),
        migrations.AddField(
            name='contact_id',
            field=models.UUIDField(default=django.utils.timezone.now),
            preserve_default=False,
        ),
    ]

Спасибо за помощь.

Я думаю, что проблема исходит из вашего файла миграции... эта строка....

field = models.UUIDField(default=django.utils.timezone.now)

Потому что вы пытаетесь заполнить поле UUID с помощью timezone.now(). Так что если этот файл миграции не важен для вас, просто удалите его (вам также нужно удалить его запись из вашей базы данных, если эта запись там есть, т.е. из таблицы django_migrations) или если это просто тестовая среда, вы можете просто удалить все из вашей базы данных и сделать makemigrations и мигрировать еще раз (после удаления этого файла миграции -> app.0021_auto_20220413_0328).

Важное замечание: Если вы хотите предоставить значение по умолчанию для вашего поля UUID, вы должны использовать что-то вроде (перед выполнением makemigrations и migrate):

from uuid import uuid4

contact_id = models.UUIDField(default=uuid4)

поскольку в вашей таблице есть несколько записей, и вы пытаетесь добавить к ним поле UUID без значения по умолчанию... тогда Django запросит значение по умолчанию, и я боюсь, что нет другого способа обеспечить uuid4() в вашем значении по умолчанию, когда Django спрашивает что-то вроде:

Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py

Также обратите внимание, что если записи в старом поле (contact_uuid) важны для вас и вы хотите добавить их значение в новое поле (contact_id), вам следует написать пользовательский файл миграции, а это уже другая история.

Вернуться на верх