В многопрофильном 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.

Вернуться на верх