2015-07-21 109 views
0

在Django中,Django的,在父類的值初始化子類的字段

說我有兩個類,A和B.

B是我希望這是一個A的孩子B中的整數字段是A的pk。我希望B中的這個字段可以在創建B對象時進行初始化。

謝謝。

p.s.基本上我想能夠從子類訪問父對象的pk。如果有一個更簡單/更好的辦法,請指教

+0

這是多表繼承的默認行爲Django的。 –

+0

是什麼?我如何從B模型訪問A的pk? B.id只會給我B的pk,但我想要pk的A – Bob

+1

你的答案是'ForeignKey'字段 - https://docs.djangoproject.com/en/1.8/ref/models/fields/#django .db.models.ForeignKey。它使得創建關係非常容易,而且它們可以自動從雙方獲得。 – bardzusny

回答

2

您需要設置A類爲外鍵B類

class B(models.Model): 
    a = models.ForeignKey(A) 
    ... 

新B = B.objects.create(A = instance_of_class_a。 ..)

+0

如果你想要具體的繼承,是的。如果不是,則需要ForeignKey字段。 – Brandon

0

如果您利用ModelForm創建B的實例,則可以將A的實例傳遞給您的表單並在其中設置值。這樣你就不必在視圖代碼中設置它。

您也想從B_Form

class B_Form(forms.ModelForm): 
    class Meta(): 
     exclude = ('a',) 

    def __init__(self, *args, **kwargs): 
     self.a = kwargs.pop('a') 
     super(B_Form, self).__init__(*args, **kwargs) 

    def save(self, force_insert=False, force_update=False, commit=True): 
     instance = super(B_Form, self).save(commit=False) 
     instance.a = self.a 

     if commit: 
      instance.save() 
     return instance 

排除a領域,在視圖中利用這種形式的類:

from your_app.forms import B_Form 

def your_view(request, a_pk): 
    a = get_object_or_404(A, pk=a_pk) 
    b_form = B_Form(request.POST or None, a=a) 

    if request.method == 'POST' and b_form.is_valid(): 
     b_form.save() 

    return render('your-template.html', {'b_form': b_form})