Python 在POST中创建对象时包括pk或models字段
我有我的订单模型,它有一个FK到项目模型。我定制了ordercreate方法来创建从POST请求传入的项目。我想对其进行自定义,以允许POST请求传递项目pk而不是名称。因此,如果pk存在,我只使用它,不需要创建新项目 但是,当我查看create()中的Python 在POST中创建对象时包括pk或models字段,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,我有我的订单模型,它有一个FK到项目模型。我定制了ordercreate方法来创建从POST请求传入的项目。我想对其进行自定义,以允许POST请求传递项目pk而不是名称。因此,如果pk存在,我只使用它,不需要创建新项目 但是,当我查看create()中的validated_数据值时,id字段不存在 class Item(models.Model): name = models.CharField(max_length=255,blank=False) class Order(m
validated_数据
值时,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)
我希望邮政机构是
{
"name":"iPhone"
}
或
我自己也试图实施这种行为,但在质量方面没有找到令人满意的方法。我认为在没有用户确认的情况下创建一个新对象是很容易出错的,因为用户可以输入“iphone”或“iPhon”而不是“iphone”,并且可以为iphone创建一个重复的项目 相反,我建议使用两个表单字段:
- 项目名称的选择字段
- 用于创建不在列表中的项的文本输入
- 用户在自动完成字段中键入项目名称
- 如果没有找到任何内容,则自动完成框建议创建“iPhon”项
- 然后用户可以意识到他们有打字错误
- 或者单击
,在这种情况下,很容易在专用视图上触发ajax请求,该视图将响应新的pk,并在表单字段中设置创建“iPhone”项目
- 表单视图可以正常运行,无需添加混乱的代码
你愿意分享你的代码吗?你是如何发布数据的?@kia这基本上是我的代码。我使用的是嵌套路由器,所以/users//orders是我的帖子URL,正文是我上面的内容。你的视图代码是什么?我检查了验证,不是吗?是的,我的错,但我发现不将此逻辑封装在form类中,使其可重用,并允许其更改而不必更改视图代码,这有点遗憾。另外,我看不出代码中的开关在哪里,它允许用户发布“name”而不是“pk”,我认为这是这个问题的重点。你确定将管理员传递给queryset有效吗?“将此逻辑封装在form类中”是指使用
ModelForm.save()
。
{
"id":15
}
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})