Я устанавливаю конечную точку 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 предложениями или несколько запросов с одним предложением.Он также должен проверять наличие дубликатов, например, если несколько предложений отправляются в одном запросе, следует избегать добавления дубликатов (как я пытался в методе проверки)
Заранее спасибо!