2

I am new to Django and trying to set up a couple of models, but have run into an error I can't seem to find a fix for.

This is the error that I am getting: psycopg2.errors.UndefinedColumn: column carts_cartitem.cart_id does not exist LINE 1: SELECT "carts_cartitem"."id", "carts_cartitem"."cart_id", "c...

This is my views file:

from django.shortcuts import render, HttpResponseRedirect
from django.urls import reverse

from products.models import Product

from .models import Cart, CartItem 

def view(request):
    try:
        the_id = request.session['cart_id']
    except:
        the_id = None
    if the_id:
        cart = Cart.objects.get(id=the_id)
        context = {'cart': cart}
    else:
        empty_message = 'Your cart is empty!'
        context = {'empty': True, 'empty_message': empty_message}

    template = 'cart/view.html'
    return render(request, template, context)

def update_cart(request, slug):
    try:
        the_id = request.session['cart_id']
    except:
        #create a cart 
        new_cart = Cart()
        new_cart.save()
        request.session['cart_id'] = new_cart.id
        the_id = new_cart.id 

    cart = Cart.objects.get(id=the_id)

    try:
        product = Product.objects.get(slug=slug)
    except Product.DoesNotExist:
        pass
    except:
        pass
    cart_item, created = CartItem.objects.get_or_create(cart=cart, product=product)
    if created:
        print('created')
    new_total = 0.00
    for item in cart.cartitem_set.all():
        line_total = float(item.product.price) * item.quantity
        new_total += line_total
    request.session['items_total'] = cart.cartitem_set.count() #count products
    cart.total = new_total
    cart.save()

    return HttpResponseRedirect(reverse('cart')) 

These are my models:

from django.db import models

class Product(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField(null=True, blank=True)
    price = models.DecimalField(decimal_places=2, max_digits=100, default=29.99)
    sale_price = models.DecimalField(decimal_places=2, max_digits=100, null=True, blank=True)
    slug = models.SlugField(unique=True)
    timestamp = models.DateTimeField(auto_now_add= True, auto_now=False)
    updated = models.DateTimeField(auto_now_add= False, auto_now=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.title

    class Meta:
        unique_together = ('title', 'slug')

    def get_absolute_url(self):
        return reverse('single_product', kwargs={'slug': self.slug})

class Cart(models.Model):
    total = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)
    timestamp = models.DateTimeField(auto_now_add= True, auto_now=False)
    updated = models.DateTimeField(auto_now_add= False, auto_now=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return "Cart id: %s" %(self.id)

class CartItem(models.Model):
    cart = models.ForeignKey(Cart, on_delete = models.CASCADE, blank=True, null=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    line_total = models.DecimalField(default=10.99, max_digits=1000, decimal_places=2)
    timestamp = models.DateTimeField(auto_now_add= True, auto_now=False)
    updated = models.DateTimeField(auto_now_add= False, auto_now=True)

    def __str__(self):
        return self.product.title

Traceback:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/cart/slug_one/

Django Version: 2.2.1
Python Version: 3.6.1
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'products',
 'carts']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
  84.                 return self.cursor.execute(sql, params)

The above exception (column carts_cartitem.cart_id does not exist
LINE 1: SELECT "carts_cartitem"."id", "carts_cartitem"."cart_id", "c...
                                      ^
) was the direct cause of the following exception:

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/me/Desktop/farmacia.testing/carts/views.py" in update_cart
  44.     cart_item, created = CartItem.objects.get_or_create(cart=cart, product=product)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/models/query.py" in get_or_create
  538.             return self.get(**kwargs), False

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/models/query.py" in get
  402.         num = len(clone)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/models/query.py" in __len__
  256.         self._fetch_all()

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/models/query.py" in _fetch_all
  1242.             self._result_cache = list(self._iterable_class(self))

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/models/query.py" in __iter__
  55.         results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/models/sql/compiler.py" in execute_sql
  1100.             cursor.execute(sql, params)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/backends/utils.py" in execute
  99.             return super().execute(sql, params)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/backends/utils.py" in execute
  67.         return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute_with_wrappers
  76.         return executor(sql, params, many, context)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
  84.                 return self.cursor.execute(sql, params)

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/utils.py" in __exit__
  89.                 raise dj_exc_value.with_traceback(traceback) from exc_value

File "/Users/me/.local/share/virtualenvs/farmacia.testing-0E8ur1aw/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
  84.                 return self.cursor.execute(sql, params)

Exception Type: ProgrammingError at /cart/slug_one/
Exception Value: column carts_cartitem.cart_id does not exist
LINE 1: SELECT "carts_cartitem"."id", "carts_cartitem"."cart_id", "c...
cisco
  • 101
  • 2
  • 13
  • 1
    First guess: You changed your models and did not run [migrations](https://docs.djangoproject.com/en/2.2/topics/migrations/)? – dhke May 04 '19 at 06:06
  • 1
    I did run migrations. – cisco May 04 '19 at 06:46
  • `CartItem` model has no field called `cart_id`. Please show the traceback so we can see cause of error – HenryM May 04 '19 at 07:09
  • Included traceback. – cisco May 04 '19 at 07:25
  • `CartItem` should have a column `cart_id` generated for the foreign key to `cart` (see https://docs.djangoproject.com/en/2.2/ref/models/fields/#database-representation). `makemigrations` does not report anything? – dhke May 04 '19 at 08:21
  • Are you getting error while updating – chirag soni May 04 '19 at 10:48
  • Even when I make changes for some reason if I run python manage.py makemigrations, I get the output 'No changes detected'. I have to run python manage.py app_name to get the migrations to appear any reason for this? As I used to be able to run without app_name and it would show the migrations. – cisco May 04 '19 at 22:41

1 Answers1

0

Looks like the carts_cartitem table was corrupt. As a few were pointing out that cart_id was not present when I took a look at the table. For some reason I could not get the migrations to update. The fix was to delete the database and run the migrations newly and is now working as intended.

cisco
  • 101
  • 2
  • 13
  • 6
    but what if you are in production stage, then would you prefer to delete your database? I am getting the same error, but there should be a proper answer for this, not delete the whole table or database, please if anyone knows the solution then answer it, Thank You in advance – Nikhil Bhardwaj Nov 15 '19 at 04:33
  • @NikhilBhardwaj did you ever fix it? – Ren Apr 09 '20 at 19:47
  • 1
    @Yokhen It can't be one proper way to fix it, but check out this StackOverflow question... https://stackoverflow.com/questions/33681952/django-migration-error-column-does-not-exist may Nexus answer can help you – Nikhil Bhardwaj Apr 11 '20 at 02:57