2017-05-18 6 views
0

J'ai un CharField sur un Django (1.9) modèle:Comment réduire max_length de CharField dans Django lorsque les données existent déjà dans db

alias = models.CharField(max_length=50) 

L'application est utilisée et a déjà des données, et il y a des objets en utilisant tous les 50 caractères déjà. Quelle est la méthode la plus simple pour réduire la longueur max_length de ce champ sans recevoir de plaintes de ma base de données de production lorsque j'essaie de migrer? DB est postgresql si cela fait une différence.

+0

voulez-vous garder ces textes? ou les supprimer? – Exprator

+0

il suffit de changer la définition dans models.py ... cela l'appliquera du côté de pythons lors de la définition de nouvelles valeurs, mais ne changera pas la contrainte sur la base de données ... –

+0

'fron django.db.models importer F; MyModels.objects. update (alias = F ('alias') [: new_length]) '(je pense!) va raccourcir tous les champs existants si c'est votre question –

Répondre

0

pour réduire max_length = 50 à d'autres max_length = 20

> python manage.py makemigrations 
> python manage.py migrate 

toutes les nouvelles données que vous enregistrez fonctionnera avec une nouvelle max_length

pour existe des données que vous pouvez faire simple script

from myproject.models import Mymodel 

for obj in Mymodel.objects.all(): 
    obj.Firstname = obj.Firstname[0:3]  
    obj.save() 
0

Je pense que le bon chemin serait simplement aller le développement d'un terminal python d accéder à tous les objets de ce modèle particulier et tronquer les valeurs alias comme:

for object in MyModel.objects.all(): 
     object.alias = object.alias[:REDUCED_LENGTH] 
     object.save() 

et le changement du max_length dans le CharField dans vos migrations de modèle et exécution.