Django-使用模型表单更新记录(表包含Unique_constraint)

时间:2018-08-21 18:43:55

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

这样的想法是,用户应该能够使用我提供的相同表格进入并更新记录。我加入了一个唯一约束,因为该想法是一个请购单可以包含多个Requisition_lines。对于初始阶段,我具有硬编码序列= 1。它最初保存了记录,但是当我尝试使用update_or_create更新记录时,我现在遇到了完整性错误。任何帮助,将不胜感激!让我知道是否需要更多信息。

Models.py

class Requisition(models.Model):
    username = models.ForeignKey(
        'users.CustomUser', on_delete=models.CASCADE, related_name='req_user')

    signature = models.CharField(max_length=10, blank=True, null=True)
    status = models.ForeignKey('RequisitionStatus', related_name='req_status', on_delete=models.CASCADE)


class RequisitionLine(models.Model):

    parent_req = models.ForeignKey('Requisition', on_delete=models.CASCADE, related_name='par_req_line' )
    sequence = models.PositiveIntegerField()
    item_code = models.ForeignKey(
        'items.ItemMaster', on_delete=models.CASCADE, related_name='req_item', blank=True, null=True)
    description = models.CharField(max_length=50, blank=True)
    extra_information = models.TextField(blank=True)
    quantity = models.PositiveIntegerField(blank=True, default=0,null=True)
    price = models.DecimalField(max_digits=19, decimal_places=2, blank=True, default=0.00,null=True)
    purchase_order = models.CharField(max_length=9, blank=True,null=True)
    po_line = models.PositiveSmallIntegerField(blank=True,null=True)
    req_delivery_date = models.DateField(blank=True,null=True)
    act_delivar_date = models.DateField(blank=True, null=True)

    class Meta:
        unique_together = ('parent_req','sequence')

Views.py

def update_requisition(request, id):

    current_req = Requisition.objects.get(id=id)

    if current_req.username == request.user:

        data = { 'parent_req': id }
        if request.method == "POST":
            req_form = ReqForm(request.POST, instance = current_req)
            if req_form.is_valid():
                req_form_line, created = RequisitionLine.objects.update_or_create(
                                            parent_req = current_req,
                                            sequence = 1,
                                            description = req_form.cleaned_data['description'],
                                            extra_information = req_form.cleaned_data['extra_information'],
                                            quantity = req_form.cleaned_data['quantity'],
                                            price = req_form.cleaned_data['price'],
                                            defaults = {'parent_req':current_req,
                                                        'sequence': 1 })  


                return(redirect(reverse('requisition:req_history')))

        else:
            try:
                req_form_line = RequisitionLine.objects.get(parent_req=current_req, sequence=1)
                req_form = ReqForm(initial=data, instance = req_form_line)
            except RequisitionLine.DoesNotExist:
                req_form = ReqForm(initial=data, instance = current_req)
            return render(request, 'req/update_req.html' , {'current_req': current_req, 'req_form': req_form})
    else:
        return HttpResponseRedirect(reverse('requisition:req_history'))

1 个答案:

答案 0 :(得分:0)

您对update_or_create函数的使用错误。您误解了关键字默认值(see docs)。您需要将所有字段更新为该字典:

                req_form_line, created = RequisitionLine.objects.update_or_create(
                                            parent_req = current_req,
                                            sequence = 1,
                                            defaults =  {
                                            description : form.cleaned_data['description'],
                                            extra_information : req_form.cleaned_data['extra_information'],
                                            quantity : req_form.cleaned_data['quantity'],
                                            price : req_form.cleaned_data['price'],
                                            })