I have the following existing twitter field on the extended UserProfile model and I’d like to change the field type from a URLField to a CharField with max_length of 20. When I try to migrate the change, I get the error
django.db.utils.DataError: value too long for type character varying(20). I do not care about existing data in that field and prefer they go blank if there is existing data when migrating. How can I change the field type and clear existing data?
class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True) # old field twitter = models.URLField(verbose_name="Twitter", blank=True) # new field # twitter = models.CharField( # max_length=20, verbose_name="Twitter Username", null=True, blank=True # )
In order to change to type and maximum length of a field which should know the longest url length in your db.
If you are using sqlite3 database then run the following query in your db_shell or sqlite3 shell or whatever you have.
SELECT MAX(LENGTH(column_name)) FROM table_name;
and then set the max_length of the new field to that value.
python manage.py shell
# Import your model profiles = UserProfile.objects.all() max_length = 0 for userprofile in userprofiles: if len(userprofile.twitter) > max_length: max_length = len(userprofile.twitter) print(max_length)
and then set your max_length to the value printed from the above code.
Answered By – shah sawood