2010-08-13 3 views
6

Si j'ai le modèle suivant dans django;Comment définir la valeur du champ par défaut à la valeur d'un autre champ dans un modèle Django?

class MyModel(models.Model): 
    name = models.CharField(max_length=50) 
    fullname = models.CharField(max_length=100,default=name) 

Comment est-ce que je mets le champ fullname par défaut? Comme il est maintenant, le nom complet par défaut à la représentation sous forme de chaîne du nom CharField.

Exemple:

new MyModel(name='joel') 

céderais joel »comme le nom et le nom complet, alors que

new MyModel(name='joel',fullname='joel karlsson') 

céderais nom différent et fullname.

Répondre

7

Je me demande si vous êtes mieux de faire cela via une méthode sur votre modèle:

class MyModel(models.Model): 
    name = models.CharField(max_length=50) 
    fullname = models.CharField(max_length=100) 

    def display_name(self): 
     if self.fullname: 
      return self.fullname 
     return self.name 

Peut-être, au lieu de display_name cela devrait être votre méthode __unicode__.

Si vous voulez vraiment faire ce que vous avez demandé si, vous ne pouvez pas le faire en utilisant le default - utiliser la méthode clean sur votre formulaire à la place (ou votre modèle, si vous utilisez trop moderne model validation (disponible depuis Django 1.2)

Quelque chose comme ça (pour la validation du modèle).

class MyModel(models.Model): 
    name = models.CharField(max_length=50) 
    fullname = models.CharField(max_length=100,default=name) 

    def clean(self): 
     self.fullname=name 

Ou comme celui-ci (pour la validation du formulaire):

class MyModelForm(ModelForm): 
    class Meta: 
     model = MyModel 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     cleaned_data['fullname'] = cleaned_data['name'] 
     return cleaned_data 
1

Pourquoi ne pas effectuer une migration avec une valeur par défaut, puis ajouter une migration de données personnalisée à votre fichier de migration? Voici un exemple de fichier de migration complète:

from datetime import timedelta 

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


# noinspection PyUnusedLocal 
def set_free_credits_added_on(apps, schema_editor): 
    # noinspection PyPep8Naming 
    UserProfile = apps.get_model('core', 'UserProfile') 
    for user_profile in UserProfile.objects.all(): 
     user_profile.free_credits_added_on = user_profile.next_billing - timedelta(days=30) 
     user_profile.save() 


# noinspection PyUnusedLocal 
def do_nothing(apps, schema_editor): 
    pass 


class Migration(migrations.Migration): 
    dependencies = [ 
     ('core', '0078_auto_20171104_0659'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='userprofile', 
      name='free_credits_added_on', 
      # This default value is overridden in the following data migration code 
      field=models.DateTimeField(
       auto_now_add=True, 
       default=django.utils.timezone.now, 
       verbose_name='Free Credits Added On' 
      ), 
      preserve_default=False, 
     ), 
     migrations.RunPython(code=set_free_credits_added_on, reverse_code=do_nothing), 
    ] 

Ici, le champ free_credits_added_on est de 30 jours avant que le champ next_billing existant.

Questions connexes