Cart model manager part 1 - lhmisho/django-eCommerce GitHub Wiki

Creating cart manager in models

carts/models.py

from django.db import models
from django.conf import settings
from products.models import Product
# Create your models here.

User = settings.AUTH_USER_MODEL

# creating custom cart manager
class CartManager(models.Manager):
    def new_cart(self, user=None):
        print(user)
        user_obj = None
        # if the user is exists and also authenticated than create user object
        if user is not None:               
            if user.is_authenticated:
                user_obj = user
        return self.model.objects.create(user=user_obj)

class Cart(models.Model):
    user        = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    products    = models.ManyToManyField(Product, blank=True)
    total       = models.DecimalField(default=0.0, decimal_places=2, max_digits=100)
    updated     = models.DateTimeField(auto_now=True)
    timestamp   = models.DateTimeField(auto_now_add=True)

    objects = CartManager()
    def __str__(self):
        return str(self.id)

playing with views

cart/views.py

from django.shortcuts import render
from .models import Cart

# Create your views here.

# method for create a cart for user.
def crete_cart(user=None):
    cart_obj = Cart.objects.create(user=None)
    print("New cart created")
    return cart_obj

def cart_home(request):
    cart_id = request.session.get("cart_id", None)
    qs = Cart.objects.filter(id=cart_id)
    # we are checking that the requested user is authenticated or not...
    # if requested user is authenticated we and the cart user is none than we puting our user to cart user
    # if the id is exits than go else create one
    if qs.count() == 1:
        cart_obj = qs.first()

        if request.user.is_authenticated and cart_obj.user is None:
            cart_obj.user = request.user
            cart_obj.save()
    else:
        cart_obj = Cart.objects.new_cart(user=request.user)
        request.session['cart_id'] = cart_obj.id

    return render(request, 'carts/cart_home.html', {})