我有两个类,一个叫phase1,一个叫phase2。phase2其中有一个实例phase1(作为外键关系)。现在我想创建另一个名为 的类POObject,它有一个外键值purchase,可以调用aphase1或phase2对象。也就是说,我希望能够创建一个POObject带有purchase集合的phase1实例,然后再将其更改为一个phase2实例。
我相信这被称为 Duck Typing,但我不确定在 Django 中是否有简单的方法。我知道 Python 很容易允许 Duck Typing,但我猜如果没有至少一些额外的工作,数据库不会允许它。
任何关于如何做到这一点的建议将不胜感激。
实施 orlenko 的建议后,我无法添加新项目。以下是处理创建新实例的视图。它的工作方式是创建一个新purchase的 in new,然后使用该purchasein的实例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