Django DRF, как ограничить элементы, созданные за один раз в сериализаторе - PullRequest
0 голосов
/ 07 мая 2019

Я устанавливаю конечную точку API POST (в Django Rest Framework), чтобы добавлять предложения для аукциона.Однако есть два ограничения, с которыми я не знаю, как справиться:

1) Претендент может иметь максимум три предложения на один аукцион

2) Предложения от одного и того же участника аукциона не могут бытьто же самое (дублировано)

Участник может применить несколько предложений в одном запросе, но я не знаю, как проверить, что он отправил не более 3 предложений, и как проверить, отправляет ли он 2 новых предложения, покаон опубликовал 2 предложения раньше (поэтому он превысил лимит).

То же самое относится к дублированию предложений, я пытался проверить это в сериализаторах, "проверять" метод проверки уже отправленных предложений, но при обработке ничего не найденоновые предложения.Похоже, что они передаются в БД вместе, не так ли?

Предложение Viewset - Здесь я использовал код, найденный в Stackoverflow для разрешения списка элементов, создаваемых в одном запросе POST

class OfferViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin):

    serializer_class = OfferSerializer
    permission_classes = (IsValidBidder,)

    def get_serializer(self, *args, **kwargs):
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super(OfferViewSet, self).get_serializer(*args, **kwargs)

Вот части OfferSerializer

def validate(self, attrs):
    ...
    already_placed_offers_qs = Offer.objects.filter(
        bidder=attrs['bidder'],
        auction=attrs['auction']
    )

    if already_placed_offers_qs.count() >= 3:
        raise LimitExceededError()

    # check for already existing same object
    if already_placed_offers_qs.filter(...).exists():
        raise DuplicationError()

    return attrs

К сожалению, эта проверка не сработает, если я отправлю несколько предложений в одном запросе.

Я ожидаю, что он проверит, нет ли у одного участника торговпревышен лимит в 3 предложения на аукцион, независимо от того, отправил ли он один запрос с 4 предложениями или несколько запросов с одним предложением.Он также должен проверять наличие дубликатов, например, если несколько предложений отправляются в одном запросе, следует избегать добавления дубликатов (как я пытался в методе проверки)

Заранее спасибо!

1 Ответ

0 голосов
/ 07 мая 2019

Уникальный вместе

Чтобы охватить (2), относительно просто, и это можно сделать, сделав необходимые поля (user, auction, price, вероятно?) Уникальными вместе либо в на уровне модели или на уровне сериализатора .

Проверка списка

(1), вероятно, лучше всего обработать, написав собственный список сериализатора и добавив туда проверку. Примерно так:

class OfferListSerializer(serializers.ListSerializer):
    def validate(self, attrs):
        already_placed_offers_qs = Offer.objects.filter(
            bidder=attrs['bidder'],
            auction=attrs['auction']
        )
        if already_placed_offers_qs.count() + len(attrs) > 3:
            raise LimitExceededError()

        return attrs

    ...

class OfferSerializer(serializers.Serializer):
    ...
    class Meta:
        list_serializer_class = OfferListSerializer
        ...

ПРИМЕЧАНИЕ : я использовал ваш LimitExceededError, но в своем собственном коде я обычно использую serializers.ValidationError, если только у меня нет причины хотеть обработать ошибку самостоятельно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...