Как использовать десятичное количество для Django-Shop CartItems

Здравствуйте, я пытаюсь отредактировать демо-версию Django-Shop.

Я установил версию 1.2.4 Django-Shop и Django 3.0.14, используя Python 3.7.5

В моем случае я хочу продавать товары также по весу. Как сказано в документации, я должен переписать CartItem.

from django.db import models
from django.utils.translation import ugettext_lazy as _

from shop.models import cart


class CartItem(cart.BaseCartItem):
    quantity = models.DecimalField(_("Cart item quantity"), decimal_places=3, max_digits=3)

Я импортировал этот CartItem в свой models.py. После этого мне пришлось переписать количество в классе OrderItem

class OrderItem(BaseOrderItem):
quantity = models.DecimalField(_("Ordered quantity"), decimal_places=3, max_digits=3)
# quantity = models.PositiveIntegerField(_("Ordered quantity"))
canceled = models.BooleanField(_("Item canceled "), default=False)

def populate_from_cart_item(self, cart_item, request):
    super().populate_from_cart_item(cart_item, request)
    # the product's unit_price must be fetched from the product's variant
    try:
        variant = cart_item.product.get_product_variant(
            product_code=cart_item.product_code)
        self._unit_price = Decimal(variant.unit_price)
    except (KeyError, ObjectDoesNotExist) as e:
        raise CartItem.DoesNotExist(e)

Теперь я могу запустить сервер без проблем, но я не могу добавить что-то в корзину. Я заглянул в shop.models.cart и попытался путем наследования перезаписать класс CartItemManager

class CartItemManager(models.Manager):
"""
Customized model manager for our CartItem model.
"""

def get_or_create(self, **kwargs):
    """
    Create a unique cart item. If the same product exists already in the given cart,
    increase its quantity, if the product in the cart seems to be the same.
    """
    cart = kwargs.pop('cart')
    product = kwargs.pop('product')
    # quantity = int(kwargs.pop('quantity', 1))
    quantity = Decimal(kwargs.pop('quantity', 1))

Но Django выдает ошибку:

Отслеживание (последний последний вызов): File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner self.run() Файл "/usr/lib/python3.7/threading.py", строка 870, in run self._target(*self._args, **self._kwargs) Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/django/utils/autoreload.py", строка 53, в wrapper fn(*args, **kwargs) Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/django/core/management/commands/runserver.py", строка 117, в inner_run self.check(display_num_errors=True) Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/django/core/management/base.py", строка 395, in check include_deployment_checks=include_deployment_checks, Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/django/core/management/base.py", строка 382, in _run_checks return checks.run_checks(**kwargs) Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/django/core/checks/registry.py", строка 72, in run_checks new_errors = check(app_configs=app_configs) Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/django/core/checks/model_checks.py", строка 34, в check_all_models errors.extend(model.check(**kwargs)) Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/shop/models/order.py", строка 518, в check for cart_field in CartItemModel._meta.fields: Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/django/utils/functional.py", строка 224, in inner self._setup() Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/shop/deferred.py", строка 225, в _setup self._wrapped = getattr(self._base_model, '_materialized_model') Файл "/var/www/vhosts/egge-cloud.de/.local/share/virtualenvs/dorfladen-MGIaIov8/lib/python3.7/site-packages/shop/deferred.py", строка 191, in getattr raise ImproperlyConfigured(msg.format(self.name)) django.core.exceptions.ImproperlyConfigured: No class implements абстрактную базовую модель: BaseCartItem.

Я не знаю, что делать...

Если заменить models.DecimalField на models.FloatField, товары могут быть добавлены в корзину, как и ожидалось. Видимо, документация, в которой явно упоминается DecimalField, неверна.

Вернуться на верх