即使在保存更新后,Django 2 也丢失了对模型的更改

Django 2 lost the change on models even after saving the update

我正在使用 Python(3.7) 和 Django(2.1) 开发一个项目,我在其中更新模型并保存它,之后如果我首先检查列表视图,它会显示更新正确,但一旦我打开详细视图,它就会丢失更新并 return 回到以前的状态。

这是我尝试过的:

来自 models.py:

class Order(models.Model):
    status_choices = (
        ('Active', 'Active'),
        ('Completed', 'Completed'),
        ('Late', 'Late'),
        ('Short', 'Short'),
        ('Canceled', 'Canceled'),
        ('Submitted', 'Submitted')
    )
    delivery_status_choices = (
        ('Accepted', 'Accepted'),
        ('Rejected', 'Rejected')
    )
    gig = models.ForeignKey('Gig', on_delete=models.CASCADE)
    seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name='selling')
    buyer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='buying')
    created_at = models.DateTimeField(auto_now=timezone.now())
    charge_id = models.CharField(max_length=234)
    days = models.IntegerField(blank=False)
    status = models.CharField(max_length=255, choices=status_choices)
    delivery = models.FileField(upload_to=content_file_name, blank=True)

    def __str__(self):
        return f'{self.buyer} order from {self.seller}'

来自 template.html:

{%  if not order.status == 'Completed' and not order.status == 'Submitted' and not order.status == 'Canceled' %}
     {% if order.buyer.username == user.username %}
           <form method="post" action="{% url 'order-cancel' %}">
                 {% csrf_token %}
                 <input type="text" name="id" value="{{ order.id }}" hidden />
                 <button type="submit" class="btn btn-primary align-content-center">Cancel the Order</button>
             </form>
      {% elif order.status == 'Canceled' %}
             <p> Your order has been canceled already!</p>
      {% endif %}
    {% else %}
        <p> You can't cancel this order now.</p>
 {% endif %}

和来自 views.py:

@login_required()
def order_cancel(request):
    if request.method == 'POST':
        try:
            order_id = request.POST.get('id')
            print(order_id)
            order = Order.objects.get(id=order_id)
            charge_id = order.charge_id
            refund = stripe.Refund.create(
                charge=charge_id,
            )
            order.status = 'Canceled'
            order.save()
            print(order.status)
            print('success')
            return HttpResponseRedirect(reverse_lazy('buying'))
        except Order.DoesNotExist:
            return redirect('home')

我正在尝试更新 orderstatus,当我向 order-cancel 视图提交请求时,首先它将 status 保存为已取消,然后我加载 detailed(单个对象页面),它将更新后的 status 恢复到之前一次。

这里有什么问题吗?

提前致谢!

您将 merge() 函数,然后最终提交会话。

db.session.merge(order)
db.session.commit()

两种解决方法。解决方案 2 始终是我的最佳选择

1.) 使用对象查询get方法

@login_required()
def order_cancel(request):
    if request.method == 'POST':
        try:
            order_id = request.POST.get('id')
            print(order_id)
            order = Order.objects.get(id=order_id)
            charge_id = order.charge_id
            refund = stripe.Refund.create(
                charge=charge_id,
            )
            order.status = 'Canceled'
            db.session.merge(order)
            db.session.commit()
            print(order.status)
            print('success')
            return HttpResponseRedirect(reverse_lazy('buying'))
        except Order.DoesNotExist:
            return redirect('home')

2.) 使用对象查询filter_by方法

@login_required()
def order_cancel(request):
    if request.method == 'POST':
        try:
            order_id = request.POST.get('id')
            print(order_id)          
            order = Order.query.filter_by(id=order_id).first()
            charge_id = order.charge_id
            refund = stripe.Refund.create(
                charge=charge_id,
            )
            order.status = 'Canceled'
            db.session.merge(order)
            db.session.commit()
            print(order.status)
            print('success')
            return HttpResponseRedirect(reverse_lazy('buying'))
        except Order.DoesNotExist:
            return redirect('home')