2010-08-13 42 views
6

Nếu tôi có mô hình sau đây trong django;Làm cách nào để đặt giá trị trường mặc định thành giá trị của trường khác trong mô hình Django?

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

Làm cách nào để đặt trường tên đầy đủ mặc định? Vì nó là ngay bây giờ, tên đầy đủ mặc định để biểu diễn chuỗi của tên CharField.

Ví dụ:

new MyModel(name='joel') 

sẽ mang lại 'joel' như cả tên và fullname, trong khi

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

sẽ mang tên khác nhau và fullname.

Trả lời

7

Tôi tự hỏi nếu bạn nên làm điều này thông qua một phương pháp trên mô hình của bạn:

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 

Có lẽ, thay vì display_name này nên phương pháp __unicode__ của bạn.

Nếu bạn thực sự muốn làm những gì bạn đã hỏi, thì bạn không thể làm điều này bằng cách sử dụng default - sử dụng phương pháp clean trên biểu mẫu của bạn thay thế (hoặc model của bạn, nếu bạn đang sử dụng mới fangled model validation (có sẵn từ Django 1.2)

Something như thế này (để xác nhận mô hình):.

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

    def clean(self): 
     self.fullname=name 

Hoặc như thế này (đối với hình thức xác nhận):

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

Làm thế nào về việc di chuyển với một giá trị mặc định, và sau đó thêm di chuyển dữ liệu tùy chỉnh vào tệp di chuyển của bạn? Dưới đây là một ví dụ hoàn chỉnh hồ sơ di cư:

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

đây lĩnh vực free_credits_added_on được thiết lập đến 30 ngày trước khi lĩnh vực next_billing hiện có.

Các vấn đề liên quan