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

时间:2016-01-01 22:35:20

标签: python django django-models django-rest-framework

我有我的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
}

2 个答案:

答案 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})