2011-02-05 30 views
12

Tôi đã đăng một câu hỏi tương tự trước đó, nhưng câu hỏi này khác. Tôi có cấu trúc mô hình của các lớp liên quan như:django: Thay đổi giá trị mặc định cho lớp mô hình mở rộng

class Question(models.Model): 
    ques_type = models.SmallIntegerField(default=TYPE1, Choices= CHOICE_TYPES) 

class MathQuestion(Question): 
    //Need to change default value of ques_type here 
    // Ex: ques_type = models.SmallIntegerField(default=TYPE2, Choices= CHOICE_TYPES) 

Tôi muốn thay đổi giá trị mặc định của ques_type trong lớp dẫn xuất. Làm thế nào tôi nên thực hiện điều này?

Trả lời

8

Đầu tiên, trong việc sử dụng thừa kế này là (ít nhất là theo thử nghiệm của tôi) không thể thay đổi mặc định của trường trong lớp con. MathQuestionQuestion chia sẻ cùng một trường ở đây, việc thay đổi mặc định trong lớp con sẽ ảnh hưởng đến trường trong lớp cha.

Bây giờ nếu những gì chỉ khác nhau giữa MathQuestionQuestion là hành vi (như vậy, MathQuestion không thêm bất kỳ lĩnh vực bên cạnh những quy định tại Question), sau đó bạn có thể làm cho nó một proxy model. Bằng cách đó, không có bảng cơ sở dữ liệu nào được tạo cho MathQuestion.

from django.db import models 

class Question(models.Model): 
    ques_type = models.SmallIntegerField(default=2) 

class MathQuestion(Question): 

    def __init__(self, *args, **kwargs): 
     self._meta.get_field('ques_type').default = 3 
     super(MathQuestion, self).__init__(*args, **kwargs) 

    class Meta: 
     proxy = True 

Test:

In [1]: from bar.models import * 

In [2]: a=Question.objects.create() 

In [3]: a.ques_type 
Out[3]: 2 

In [4]: b=MathQuestion.objects.create() 

In [5]: b.ques_type 
Out[5]: 3 
+2

Tôi đang thêm các trường mới trong lớp dẫn xuất. Vì vậy, phương pháp lớp proxy sẽ không hoạt động. – Neo

+0

Không thể thiết lập trường ques_type trong phương thức __init__? – Neo

+0

@Neo Tôi đã thử, nhưng theo [tài liệu] (http://docs.djangoproject.com/en/1.2/topics/db/models/#field-name-hiding-is-not-permitted) thì đây không phải là có thể: ** Nếu một lớp cơ sở có một trường được gọi là tác giả, bạn không thể tạo một trường mô hình khác được gọi là tác giả trong bất kỳ lớp nào thừa hưởng từ lớp cơ sở đó. ** –

0

này rất dễ dàng để làm bằng cách sử dụng đóng cửa.

từ các mô hình nhập khẩu django.db

# You start here, but the default of 2 is not what you really want. 

class Question(models.Model): 
    ques_type = models.SmallIntegerField(default=2) 

class MathQuestion(Question): 

    def __init__(self, *args, **kwargs): 
     self._meta.get_field('ques_type').default = 3 
     super(MathQuestion, self).__init__(*args, **kwargs) 

    class Meta: 
     proxy = True 

Việc đóng cửa cho phép bạn định nghĩa nó như thế nào bạn thích nó.

từ các mô hình nhập khẩu django.db

def mkQuestion(cl_default=2): 
    class i_Question(models.Model): 
     ques_type = models.SmallIntegerField(default=cl_default) 

    class i_MathQuestion(i_Question): 

     def __init__(self, *args, **kwargs): 
      super(MathQuestion, self).__init__(*args, **kwargs) 
    return i_MATHQUESTION 


MathQuestion = mkQuestion() 
MathQuestionDef3 = mkQuestion(3) 

# Now feel free to instantiate away. 
1

Sử dụng một Form hoặc ModelForm, mà bạn có thể ghi đè lên lĩnh vực này. Đối với các mô hình, thiết lập giá trị mặc định trong nó __init__ phương pháp như vậy:

class Question(models.Model): 
    ques_type = models.SmallIntegerField(default=2) 

class MathQuestion(Question): 

    def __init__(self, *args, **kwargs): 
     super(MathQuestion, self).__init__(*args, **kwargs) 
     self.ques_type = 3 

    class Meta: 
     proxy = True 

Lưu ý rằng điều này phải được thực hiện sau khi gọi init tầng lớp phụ huynh.

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/

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