MultipleObjectsReturned в / checkout / get () вернул более одного ордера - вернул 2 - PullRequest
0 голосов
/ 22 апреля 2020

Привет. Я пытаюсь разработать сайт электронной коммерции, используя Django. У меня есть две модели и виды в отдельных папках, одна модель заказа и вид, другая модель заказа и вид заказа. Представление заказа создает новый заказ каждый раз, когда товар добавляется в корзину. И представление оформления заказа создает новый адрес для выставления счетов. Я хочу связать адрес выставления счета, который создается с заказом при отправке формы оформления заказа. Но по какой-то причине этого не происходит. Выдает ошибку:

MultipleObjectsReturned at /checkout/
get() returned more than one Order -- it returned 2!

В чем проблема?

Мои orders.models.py:

from django.db import models
from shopping_cart.models import Cart
from django.contrib.auth import get_user_model
from accounts2.models import BillingAddress


STATUS_CHOICES = (
       ("Started", "Started"),
       ("Abandoned", "Abandoned"),
       ("Finished", "Finished"),
   )

User = get_user_model()

class Order(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
   order_id = models.CharField(max_length=120, default='ABC',  unique=True)
   cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
   status = models.CharField(max_length=120, choices=STATUS_CHOICES, default="Started")
   sub_total = models.DecimalField(default=10.99, max_digits=1000, decimal_places=2)
   tax_total = models.DecimalField(default=0.00, max_digits=1000, decimal_places=2)
   final_total = models.DecimalField(default=10.99, max_digits=1000, decimal_places=2)
   timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
   billing_address = models.ForeignKey(BillingAddress, on_delete=models.SET_NULL, blank= True, null=True)

Мои orders.views.py:

@login_required
def order(request):
   try:
       the_id = request.session['cart_id']
       cart = Cart.objects.get(id=the_id)
   except:
       the_id = None
       return redirect(reverse("myshop-home"))

   try:
       new_order = Order.objects.get(cart=cart)
   except Order.DoesNotExist:
       new_order = Order(cart=cart)
       new_order.cart = cart
       new_order.user = request.user
       new_order.order_id = id_generator()
       new_order.save()
   except:
       return redirect(reverse("cart"))


   if new_order.status == "Finished":
       #cart.delete()
       del request.session['cart_id']
       del request.session['items_total']
       return redirect(reverse("cart"))


   context = {"address_form": address_form, "cart": cart}
   template = "orders/checkout.html"
   return render(request, template, context)

Мои аккаунты.models.py:


class BillingAddress(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete= models.CASCADE)
    street_address = models.CharField(max_length=100)
    apartment_address = models.CharField(max_length=100)
    country = CountryField(multiple=False)
    zip = models.CharField(max_length=100)

    class Meta:
        verbose_name_plural = "Billing Addresses"

Мои аккаунты.views.py:

class CheckoutView(LoginRequiredMixin, View):
    def get(self, *args, **kwargs):
        the_id = self.request.session['cart_id']
        cart = Cart.objects.get(id=the_id)
        form = CheckoutForm()
        context = {"form": form, "cart": cart}
        return render(self.request, "orders/checkout.html", context)

    def post(self, *args, **kwargs):
        form = CheckoutForm(self.request.POST or None)
        try:
            order = Order.objects.get(user = self.request.user)
            if form.is_valid():
                street_address = form.cleaned_data.get('street_address')
                apartment_address = form.cleaned_data.get('apartment_address')
                country = form.cleaned_data.get('country')
                zip = form.cleaned_data.get('zip')
                # same_shipping_address = form.cleaned_data.get('same_billing_address')
                # save_info = form.cleaned_data.get('save_info')
                payment_option = form.cleaned_data.get('payment_option')
                billing_address = BillingAddress(
                        user = self.request.user,
                        street_address = street_address,
                        apartment_address = apartment_address,
                        country = country,
                        zip = zip
                    )
                billing_address.save()
                order.billing_address = billing_address
                order.save()
                return redirect('checkout')
            messages.warning(self.request, "Failed checkout")
            return redirect('checkout')

        except ObjectDoesNotExist:
            messages.warning(self.request, "You do not have an active order")
            return redirect('/')

1 Ответ

0 голосов
/ 22 апреля 2020

Используйте Order.objects.filter(user=user).last(), чтобы получить новейшую строку или попытаться запомнить идентификатор заказа при создании заказа и выполнить фильтрацию с помощью Order.objects.get(id=id)

...