Доброго времени суток.
Предыстория:
Было задание: сделать 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
. Я так понимаю, что когда я добавил второй раз продукт, то Джанго-Оскар посчитал, что у меня есть корзина, и смержил их двоих.
Поможете советом? Буду очень благодарен.