Python 在POST中创建对象时包括pk或models字段

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

我有我的订单模型,它有一个FK到项目模型。我定制了ordercreate方法来创建从POST请求传入的项目。我想对其进行自定义,以允许POST请求传递项目pk而不是名称。因此,如果pk存在,我只使用它,不需要创建新项目

但是,当我查看create()中的
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”项
  • 然后用户可以意识到他们有打字错误
  • 或者单击
    创建“iPhone”项目
    ,在这种情况下,很容易在专用视图上触发ajax请求,该视图将响应新的pk,并在表单字段中设置
  • 表单视图可以正常运行,无需添加混乱的代码
这就是django autocomplete light中“动态创建选项”示例的演示方式。

您可能需要使用


你愿意分享你的代码吗?你是如何发布数据的?@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})