我有我的Order模型,它有一个FK到Item模型。我自定义了Order create方法来创建从POST请求传入的项目。我想自定义它以允许POST请求传递Item pk而不是名称。所以如果pk存在,我只是使用它而不需要创建一个新项目。
但是,当我查看create()中的validated_data
值时,id字段不存在。
class Item(models.Model):
name = models.CharField(max_length=255,blank=False)
class Order(models.Model):
user = models.OneToOneField(User,blank=True)
item = models.OneToOneField(Item,blank=True)
我希望POST正文
{
"name":"iPhone"
}
或
{
"id":15
}
答案 0 :(得分:0)
我自己试图实现这种行为,并没有找到满意的质量方法。我认为在没有用户确认的情况下创建新对象容易出错,因为用户可以输入“iphone”或“iPhon”而不是“iPhone”,并且可以为iphone创建重复项目。 / p>
相反,我建议有两个表单字段:
然后,handle in the form class很容易。
或者,使用自动完成功能:
-rc1-update1
,create the "iPhon" Item
,在这种情况下,很容易在专用视图上触发ajax请求,该请求将以新pk响应,在表单字段中设置这就是在django-autocomplete-light中演示“动态创建选择”的示例。
答案 1 :(得分:0)
您可能需要使用Django Forms。
from django import forms
from django.contrib.auth.decorators import login_required
from django.core.exceptions import ValidationError
from .models import Order, Item
from django.shortcuts import render
class OrderForm(forms.Form):
item_name = forms.CharField(required=False)
item = forms.ModelChoiceField(queryset=Item.objects.none(), required=False)
def __init__(self, *args, **kwargs):
super(OrderForm, self).__init__(*args, **kwargs)
self.fields['item'].queryset = Item.objects.all()
def clean_item(self):
item_name = self.cleaned_data['item_name']
item = self.cleaned_data['item']
if item:
return item
if not item_name:
raise ValidationError('New item name or existing one is required.')
return Item.objects.create(name=item_name)
@login_required
def save(request):
if request.method == 'GET':
return render(request, 'template.html', {'form': OrderForm()})
user = request.user
form = OrderForm(request.POST)
if form.is_valid():
order = Order.objects.create(user=user, item=form.cleaned_data['item'])
return render(request, 'template.html', {'form': OrderForm(), 'order': order, 'success': True})
else:
return render(request, 'template.html', {'form': OrderForm(), 'error': True})