我有两个类,一个叫phase1
,一个叫phase2
。phase2
其中有一个实例phase1
(作为外键关系)。现在我想创建另一个名为 的类POObject
,它有一个外键值purchase
,可以调用aphase1
或phase2
对象。也就是说,我希望能够创建一个POObject
带有purchase
集合的phase1
实例,然后再将其更改为一个phase2
实例。
我相信这被称为 Duck Typing,但我不确定在 Django 中是否有简单的方法。我知道 Python 很容易允许 Duck Typing,但我猜如果没有至少一些额外的工作,数据库不会允许它。
任何关于如何做到这一点的建议将不胜感激。
实施 orlenko 的建议后,我无法添加新项目。以下是处理创建新实例的视图。它的工作方式是创建一个新purchase
的 in new
,然后使用该purchase
in的实例new2
创建一个POObject
.
def new(request):
if request.method == 'POST':
form = PurchaseOrderForm(request.POST)
if form.is_valid():
new_po = form.save()
return HttpResponseRedirect('/workflow/%s' %new_po.request_number)
else:
return render(request, 'input.html', {'input_type': 'Purchase Order','formset': form, 'error': True})
else:
form = PurchaseOrderForm()
return render(request, 'input.html', {'input_type': 'Purchase Order','formset': form,})
def new2(request, number):
po=PurchaseOrder.objects.get(pk=number)
if request.method == 'POST':
form = WorkflowForm(request.POST, initial={'purchase': PurchaseOrder.objects.get(pk=number), 'state': 'request'})
if form.is_valid():
new_flow = form.save()
return HttpResponse('Good')
else:
print form.errors
return render(request, 'new-workflow.html', {'form': form, 'purchase': po})
else:
form = WorkflowForm(initial={'purchase': PurchaseOrder.objects.get(pk=number), 'state': 'request'})
return render(request, 'new-workflow.html', {'form': form, 'purchase': po, 'type': 'New'})
适当的表单类是:
class WorkflowForm(ModelForm):
purchase1=forms.ModelChoiceField(queryset=PurchaseOrder.objects.all(), required=False)
purchase2=forms.ModelChoiceField(queryset=Phase2.objects.all(), required=False)
details = forms.CharField(required=False)
class Meta:
model = POObject