В многопрофильном Django Rest API, как ограничить клиентов/покупателей, чтобы они могли делать заказы только у одного поставщика за раз?
Вот мои упрощенные модели
Это моя пользовательская модель пользователя, вместо имени пользователя используется email
class CustomUser(AbstractUser):
id = models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True
)
email = models.EmailField(
_('email address'),
unique=True,
blank=False
)
...
Приложение к продукту
Это приложение используется продавцами для размещения своих товаров
class Product(TimeStampedModel):
id = models.UUIDField(
default=uuid_lib.uuid4,
editable=False,
primary_key=True
)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
auto_created=True,
related_name='products'
)
title = models.CharField(
_("Title"),
max_length=200
)
category = models.ForeignKey(
Category,
on_delete=models.CASCADE
)
...
Приложение Cart содержит две модели cart и cart item model
class Cart(TimeStampedModel):
...
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
related_name="cart",
on_delete=models.CASCADE
)
...
class CartItem(TimeStampedModel):
...
cart = models.ForeignKey(
Cart,
related_name="items",
on_delete=models.CASCADE,
null=True,
blank=True
)
product = models.ForeignKey(
Product,
related_name="cart_product",
on_delete=models.CASCADE,
)
seller = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name="cart_seller",
on_delete=models.CASCADE,
null=True,
blank=True
)
...
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = (
'email',
)
class CartProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = (
...
'user',
...
)
class CartSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
items = serializers.StringRelatedField(many=True)
class Meta:
model = Cart
fields = (
'id',
'user',
'created',
'updated',
'items',
)
class CartItemSerializer(serializers.ModelSerializer):
product = serializers.StringRelatedField(read_only=True)
cart = serializers.StringRelatedField(read_only=False)
seller = serializers.StringRelatedField(read_only=False)
class Meta:
model = CartItem
fields = (
'id',
'cart',
'cart_id',
'product',
'product_id',
'quantity',
'seller',
'seller_id',
)
def create(self, request, *args, **kwargs):
request = self.context['request']
user = request.user
product = Product.objects.get(pk=request.data['product_id'])
cart = Cart.objects.get(pk=request.data['cart_id'])
seller = CustomUser.objects.get(pk=request.data['seller_id'])
current_item = CartItem.objects.filter(cart=cart, product=product, seller=seller)
# Prevent a customer from adding the same item twice
if current_item.count() > 0:
raise NotAcceptable("You already have this item in your cart")
....
return Response(serializer.data, status=status.HTTP_201_CREATED)
Покупатель добавляет товар в корзину:
{ "cart_id": "4f5f9efd-5814-4cf0-a8c1-20899f71d691", "product_id": "bf7d4afa-9e1d-4c66-8605-6d9f29f2b805", "seller_id": "0c10061d-e3bd-482d-97df-6b27e39defb5", "quantity": 2 }
После POST:
После POST мы имеем : HTTP 200 OK Разрешить: GET, POST, HEAD, OPTIONS
[ { "id": "57f67602-7131-4201-8ed4-6fe036630c58", "cart": "4f5f9efd-5814-4cf0-a8c1-20899f71d691", "cart_id": "4f5f9efd-5814-4cf0-a8c1-20899f71d691", "product": "Кофе L", "product_id": "bf7d4afa-9e1d-4c66-8605-6d9f29f2b805", "количество": 2, "seller": "example@gmail.com", "seller_id": "0c10061d-e3bd-482d-97df-6b27e39defb5" } ]
Как предотвратить следующее? Если вы видите, что покупатель добавил в корзину два продукта в корзину от разных продавцов одновременно 'example@gmail.com' и 'jimk@gmail.com'.
[ { "id": "57f67602-7131-4201-8ed4-6fe036630c58", "cart": "4f5f9efd-5814-4cf0-a8c1-20899f71d691", "cart_id": "4f5f9efd-5814-4cf0-a8c1-20899f71d691", "product": "Кофе L", "product_id": "bf7d4afa-9e1d-4c66-8605-6d9f29f2b805", "количество": 2, "seller": "example@gmail.com", "seller_id": "0c10061d-e3bd-482d-97df-6b27e39defb5" }, { "id": "398533d4-556e-491d-8ad4-f5672312b1eb", "cart": "4f5f9efd-5814-4cf0-a8c1-20899f71d691", "cart_id": "4f5f9efd-5814-4cf0-a8c1-20899f71d691", "product": "Smoothies", "product_id": "f5e3f2b5-e8d4-4f8d-819a-cbe9e9e4f168", "количество": 2, "seller": "jimk@gmail.com", "seller_id": "a23b8961-c710-4d36-8b9f-0533df77dd32" } ]
Вот что я пробовал:
serializer.py
from collections import Counter
def create(self, request, *args, **kwargs):
request = self.context['request']
user = request.user
product = Product.objects.get(pk=request.data['product_id'])
cart = Cart.objects.get(pk=request.data['cart_id'])
seller = CustomUser.objects.get(pk=request.data['seller_id'])
current_item = CartItem.objects.filter(cart=cart, product=product, seller=seller)
# Prevent a customer from adding the same item twice
if current_item.count() > 0:
raise NotAcceptable("You already have this item in your cart")
entry_list =
list(CartItem.objects.filter(cart=cart).values_list('seller_id',flat=True).all())
s = Counter(entry_list).keys()
q = Counter(entry_list).values()
Здесь я хотел получить список (уникальных) продавцов, у которых клиент делает заказ, затем предотвратить количество продавцов, если их больше 1.
но первый продавец не отображается в списке после размещения....
Помогите, пожалуйста, я новичок в Django.