Трудно быть уверенным без дополнительной информации, поэтому я спрошу несколько дополнительных вещей:
- Какая строка выдает ошибку?
- Что такое slug-значение когда возникает ошибка? (URL-адрес не указан вверху)
- Что такое модель 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