@MAGistr_MTM
Учусь программировать

Как создать новую корзину?

Доброго времени суток.

Предыстория:
Было задание: сделать 5 магазинов с одним бэк-оффисом, но там с разными ценами и тп. После многих обсуждений и проб решили использовать одну базу данных и подключить django.contrib.sites для разделения контента по сайтах. Для магазинов выбрали Django-Oscar.

В Оскаре следующая структура: есть приложение Basket. В нем есть два основных класса: Basket и Line. Оба класса изменил, что бы использовать с django.contrib.sites(добавил поля). Все заработало, то есть, на разных сайтах разные корзины. Но когда в корзину кладу одинаковые товары на разных сайтах, и покупаю на одном из них, то на втором корзина становится пустой.

Полез в Джанговскою админку, и выяснил, что когда додаёшь продукт в корзину, то на соответствующем сайте создается Line и Basket и Line связывается с Basket. Но, когда на втором сайте добавить в корзину тот же продукт, то создастся толькоLine и он будет связан из Basket на другом сайте. Иными словами - корзина одна на два сайта.

Как мне это изменить? Как сделать так, что бы корзина создавалась только на том сайте, на котором был добавлен товар в нее?

Заранее благодарен за помощь.

Вот примеры моделей:
class Basket(AbstractBasket):

	site = models.ForeignKey(Site, blank=True, null=True, on_delete=models.CASCADE)

	objects = CurrentSiteManager()

	def __init__(self, *args, **kwargs):
		super(AbstractBasket, self).__init__(*args, **kwargs)

		self._lines = None
		self.offer_applications = results.OfferApplications()
		self.site = Site.objects.get_current()

class Line(AbstractLine):

	site = models.ForeignKey(Site, blank=True, null=True, on_delete=models.CASCADE)

	objects = CurrentSiteManager()

	def __init__(self, *args, **kwargs):
		super(AbstractLine, self).__init__(*args, **kwargs)
		# Instance variables used to persist discount information
		self._discount_excl_tax = D('0.00')
		self._discount_incl_tax = D('0.00')
		self._affected_quantity = 0
		self.site = Site.objects.get_current()


=================UPDATE===============
Пошел по советам, и немножко покопал, узнал что нужно изменить менеджеров для корзины. Вот что получилось:
class OpenBasketManager(models.Manager):
    """For searching/creating OPEN baskets only."""
    status_filter = "Open"

    def get_queryset(self):
        return super(OpenBasketManager, self).get_queryset().filter(
            status=self.status_filter, site__id = settings.SITE_ID)

    def get_or_create(self, **kwargs):
        return self.get_queryset().get_or_create(
            status=self.status_filter, **kwargs)

Я просто вставил site__id = settings.SITE_ID. И все заработало. Но, когда я добавил в пусутую корзину продукт и потом на втором сайте тот же продукт добавляю в корзину, то вылетает ошибка:
IntegrityError at /en-gb/basket/add/15/
duplicate key value violates unique constraint "basket_line_basket_id_7d0d707a7fd92c45_uniq"
DETAIL:  Key (basket_id, line_reference)=(13, 15_11) already exists.

И в админке Джанго увидел, что статус корзины, которую я создал позднее не Open - currently active, а Merged - superceded by another basket. Я так понимаю, что когда я добавил второй раз продукт, то Джанго-Оскар посчитал, что у меня есть корзина, и смержил их двоих.

Поможете советом? Буду очень благодарен.
  • Вопрос задан
  • 657 просмотров
Решения вопроса 1
winordie
@winordie
Лучшая документация -- исходники
Здесь видно, что при добавлении товара корзина берется из request.
Здесь видно, что при оформлении заказа корзина снова берется из request.
Здесь корзина в request добавляется.

Вывод: именно в middleware надо реализовывать логику выбора текущей корзины.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы