Search code examples
pythondjangodjango-viewse-commercemixins

UserCheckout matching query does not exist


I'm trying to display all orders matching each logged in user, I dont understand why it gives me issues when trying to filter for users as it gives me that UserCheckout does not have any matching queries:

orders/views.py

class OrderList(LoginRequiredMixin, ListView):

    queryset = Order.objects.all()

    def get_queryset(self):
        
        user_check_id = self.request.user.id
        user_checkout = UserCheckout.objects.get(id=user_check_id)  
        return super(OrderList, self).get_queryset().filter(user=user_checkout)

orders/mixins.py

class LoginRequiredMixin(object):

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(request,*args, **kwargs)

orders/models.py

class UserCheckout(models.Model):
            user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete = models.CASCADE) # not required as to allow guests to checkout too
            email = models.EmailField(unique=True) # required, unique as if there the guest already has an authentication just one email needed
        
        
            def __str__(self):
                return self.email
    
class Order(models.Model):
        status                  = models.CharField(max_length=120, choices=ORDER_STATUS_CHOICES, default='created')
        cart                    = models.ForeignKey(Cart, on_delete=models.CASCADE)
        user                    = models.ForeignKey(UserCheckout, null=True, on_delete=models.CASCADE)
        billing_address         = models.ForeignKey(UserAddress, related_name='billing_address', null=True,on_delete=models.CASCADE)
        shipping_address        = models.ForeignKey(UserAddress, related_name='shipping_address', null=True, on_delete=models.CASCADE)
        shipping_total_price    = models.DecimalField(max_digits=50, decimal_places=2, default=5.99)
        order_total             = models.DecimalField(max_digits=50, decimal_places=2)
    
        def __str__(self):
            return str(self.cart.id)

Error it gives me:

   DoesNotExist at /orders/
UserCheckout matching query does not exist.

Solution

  • You are getting an error because you are trying to use the User's primary key (id) as the UserCheckout's primary key i.e. the lines:

    user_check_id = self.request.user.id
    user_checkout = UserCheckout.objects.get(id=user_check_id)
    

    Change these lines to:

    user = self.request.user
    user_checkout = UserCheckout.objects.get(user=user)
    

    Also this can throw an Exception if a UserCheckout instance doesn't exist you can catch that using try-except or use django's shortcut function get_object_or_404:

    from django.shortcuts import get_object_or_404
    
    user_checkout = get_object_or_404(UserCheckout, user=user)