2010-08-13 12 views
6

Wenn ich das folgende Modell in Django habe;Wie setze ich den Standardfeldwert auf den Wert eines anderen Feldes in einem Django-Modell?

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

Wie mache ich das Fullname-Feld standardmäßig zu benennen? Wie es jetzt ist, ist der Fullname standardmäßig die Zeichenfolgendarstellung des Namens CharField.

Beispiel:

new MyModel(name='joel') 

ergäbe 'Joel', da beide Namen und Fullname, während

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

anderen Namen und Fullname ergeben würde.

Antwort

7

Ich frage mich, ob Sie besser tun dies durch ein Verfahren nach Modell sind:

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 

Vielleicht, statt display_name dies Ihr __unicode__ Methode sein sollte.

Wenn Sie wirklich tun wollen, was Sie aber gefragt haben, dann können Sie nicht tun dies die default mit - nutzen Sie die clean Methode auf dem Formular statt (oder Ihr Modell, wenn Sie mit neumodischen model validation (verfügbar seit Django 1,2)

So etwas wie dies (für Modellvalidierung).

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

    def clean(self): 
     self.fullname=name 

Oder wie folgt aus (für Formular-Validierung):

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

Sie möchten eine Migration mit einem Standardwert vornehmen und dann eine benutzerdefinierte Datenmigration zu Ihrer Migrationsdatei hinzufügen? Hier ist eine vollständige Migration Datei Beispiel:

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), 
    ] 

hier das free_credits_added_on Feld zu 30 Tage vor dem bestehenden next_billing Feld gesetzt ist.