Почему ошибка «ValueError at / add_to_cart / prin-shirt / Field« id »ожидала числа, но получила« красный »». быть брошенным? - PullRequest
2 голосов
/ 06 мая 2020

Я получил эту ошибку и понятия не имею, почему это происходит '.

Я пытаюсь добавить вариации к своему продукту. Итак, когда я отправляю, я печатаю значения, которые выбирают пользователи, набрав print(request.POST.getlist('variations', [])), и они возвращаются как ['Red', 'Medium']. Теперь я пытался проверить, есть ли в корзине уже соответствующий товар. Если он существует, я бы увеличил количество, а если его нет, я бы добавил новый элемент. Ошибка возникает в строке

order_item_qs = order_item_qs.filter (

Но мой код не работает. Кто-нибудь может мне помочь с этим? Заранее спасибо!

My views.py:

@login_required
def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    variations = request.POST.getlist('variations', [])
    print(variations)

    minimum_variation_count = Variation.objects.filter(item=item).count()
    if len(variations) < minimum_variation_count:
        messages.info(request, "Please specify the required variations.")


    order_item_qs = OrderItem.objects.filter(
        item=item,
        user= request.user,
        ordered=False,
    )

    for v in variations:
        order_item_qs = order_item_qs.filter(
            item_variations__exact=v
        )

    if order_item_qs.exists():
        order_item = order_item_qs.first()
        order_item.quantity += 1
        order_item.save()
    else:
        order_item = OrderItem.objects.create(
            item=item,
            user= request.user,
            ordered=False,
        )

        order_item.item_variations.add(*variations)
        order_item.save()

    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        if not order.items.filter(item__id=order_item.id).exists():
            order.items.add(order_item) 
            messages.success(request, "Product added to cart.")
            return redirect("order-summary")
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(user=request.user, ordered_date=ordered_date)
        order.items.add(order_item)
        messages.success(request, "Product added to cart.")
        return redirect("order-summary")
    return redirect("order-summary")

My models.py:

class Item(models.Model):
   title = models.CharField(max_length=120)
   price = models.FloatField()

class Variation(models.Model):
   item = models.ForeignKey(Item, on_delete=models.CASCADE)
   name = models.CharField(max_length=50) # size, color

class ItemVariation(models.Model):
   variation  = models.ForeignKey(Variation, on_delete=models.CASCADE)
   value = models.CharField(max_length=50) # small, medium large etc

class OrderItem(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   item  = models.ForeignKey(Item, on_delete=models.CASCADE)
   item_variations = models.ManyToManyField(ItemVariation)
   quantity = models.IntegerField(default=1)
   ordered = models.BooleanField(default=False)

class Order(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   ref_code = models.CharField(max_length=20)
   ordered = models.BooleanField(default=False)
   items = models.ManyToManyField(OrderItem)
   start_date = models.DateTimeField(auto_now_add= True)
   ordered_date = models.DateTimeField()

My order_summary. html (где я могу увеличить количество ):

<a href="{% url 'remove-single-item-from-cart' order_item.item.slug %}" class="btn mr-2"><i class="fa fa-minus"></i></a>
{{ order_item.quantity }}<a href="{% url 'add-to-cart' order_item.item.slug %}" class="btn ml-2"><i class="fa fa-plus"></i></a>

My urls.py:

path('add_to_cart/<slug>/', orders_views.add_to_cart, name='add-to-cart'),
path('remove_from_cart/<slug>/', orders_views.remove_from_cart, name='remove-from-cart'),

1 Ответ

1 голос
/ 06 мая 2020

Трудно быть уверенным без дополнительной информации, поэтому я спрошу несколько дополнительных вещей:

  1. Какая строка выдает ошибку?
  2. Что такое slug-значение когда возникает ошибка? (URL-адрес не указан вверху)
  3. Что такое модель OrderItem

Исходный ответ:

При этом я думаю, что ошибка заключается в этой строке: order_item.item_variations.add(*variations). вариации, я считаю, ['Green', ...]. Я думаю, что это будет что-то вроде order_item.item_variations.add(item.variation_set.filter(item_variation__value=...).first().pk) с текущей настройкой модели. Я думаю, причина в том, что значение ItemVariation не похоже на primary_key, который add принимает как аргументы (или экземпляры)

Дополнительное объяснение:

Во-первых, я думаю, что ваш чек, чтобы проверить, находится ли товар уже в корзине, неверен:

order_item_qs = order_item_qs.filter(
            item_variations__exact=v
        )

должно быть:

order_item_qs = order_item_qs.filter(
            item_variations__value=v
        )

Я изменил его, чтобы проверить значение, которое здесь вы найдете строки, которые вы сравниваете. Я полагаю, что предыдущая проверяла id. Я также удалил __exact, но понимаю, что __exact подразумевается в фиксированной версии.

Во-вторых, я считаю, что вы используете .add() ^ неправильно для вашего RelatedManager (как вы получаете доступ к множеству -to-many поле). Согласно вашим моделям, ItemVariation не имеет установленного первичного ключа в модели. Это означает, что django сгенерирует его автоматически. ^^ Автоматически сгенерированным полем будет AutoField, который имеет тип int. Это означает, что для использования OrderItem.item_variations.add() вам необходимо предоставить экземпляр ItemVariation или первичный ключ ItemVariation.

В настоящее время вы предоставляете ему несколько строк. Чтобы исправить это, вам нужно будет запросить ItemVariations, чтобы получить правильный экземпляр. Я бы порекомендовал изменить order_item.item_variations.add(*variations) на многострочный подход:

item_variations_to_add = ItemVariations.objects.filter(
    variation__item=item,
    value__in=variations
).values_list('id', flat=True)
order_item.item_variations.add(*item_variations_to_add)

Это должно исправить ошибку, хотя представляет собой потенциальную проблему, связанную с отсутствием вариантов в базе данных. Это еще одна проблема, о которой вам следует подумать, но она выходит за рамки этого ответа.

^ RelatedManager.add() документация: https://docs.djangoproject.com/en/dev/ref/models/relations/#django .db.models.fields.related.RelatedManager.add

^^ Automati c Документация по первичным ключам: https://docs.djangoproject.com/en/dev/topics/db/models/#automatic -primary-key-fields

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...