Django/Heroku - Обработка исключения ObjectDoesNotExist при передаче данных из API в базу данных Django
Мое приложение django получает данные из API.
 Очень маловероятно, что API отправит неверную информацию, но я пытаюсь предусмотреть возможность того, что API может отправить данные, которые вернут ObjectDoesNotExist от попыток злоумышленников.
Ниже показана моя попытка обработать исключение, оставив данные на 2 попытки. После этого я хочу, чтобы он перестал проталкивать данные.
Я оставил несколько операторов печати, чтобы отслеживать выполнение попыток. Но ни одна из них не выводится. Это заставляет меня думать, что данные, полученные от API, считаются действительными (потому что они существуют), и только когда данные попадают в базу данных, приложение понимает, что они не существуют.
Есть ли у вас предложение, как мне с этим справиться? (Надеюсь, я ясно выразился)
модели:
class UserProfile(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    def __str__(self):
        return str(self.user)
class ItemisedLoyaltyCard(models.Model):
    user = models.ForeignKey(UserProfile, blank=True, null=True, on_delete=models.CASCADE)
    venue = models.ForeignKey(Venue, blank=True, null=True, on_delete=models.CASCADE, related_name="venueitemisedloyaltycard")
    add_points = models.DecimalField(name = 'add_points', null = True, blank=True, default=0, decimal_places=2, max_digits=5
    
    def __str__(self):
        ret
функция:
def API_data(request):
    userprofile_id = request.GET.get('userprofile_id', '')
    venue_id = request.GET.get('venue_id', '')
    user = UserProfile.objects.get(id=userprofile_id)
    venue = Venue.objects.get(id=venue_id)
    venue_loyalty_point_rule = VenueLoyaltyPointRule.objects.get(venue=venue)
    scans = ItemisedLoyaltyCard.objects.filter(
        user_id=user.id, venue=venue)
    is_point_valid = loyalty_card_validation_rule(
        scans, user, venue, venue_loyalty_point_rule)
    if is_point_valid:
        try_count = 0
        max_retries = 2  # Define the maximum number of retries
        while try_count < max_retries:
            try:
                ItemisedLoyaltyCard.objects.create(
                    user_id=user.id, venue=venue, add_points=venue_loyalty_point_rule.points)
                # If creation succeeds, set data and break the loop
                data = {'points': venue_loyalty_point_rule.points, 'user': user.id, 'venue': venue.name,
                        'success': is_point_valid, 'frequency_rule': venue_loyalty_point_rule.frequency}
                break
            except ObjectDoesNotExist: <!-- This part is not showing getting printed-->
                try_count += 1
                print("Retrying...")
        else:
            # If max retries exceeded, set error message in data
            print("Max retries exceeded. Unable to create loyalty card entry.")
            data = {'error': 'Max retries exceeded. Unable to create loyalty card entry.'}
    else:
        print("Invalid loyalty card validation rule.")
        data = {'error': 'Invalid loyalty card validation rule.'}
    return HttpResponse(json.dumps(data), content_type="application/json")
 Вот обходной путь к вашему API для обработки venue существования в приложении.
def API_data(request):
    userprofile_id = request.GET.get('userprofile_id', '')
    venue_id = request.GET.get('venue_id', '')
    user = UserProfile.objects.get(id=userprofile_id)
    
    try:
    
      # first we check if venu id actually exist
      venue = Venue.objects.get(id=venue_id)
      venue_loyalty_point_rule = 
      VenueLoyaltyPointRule.objects.get(venue=venue)
      scans = ItemisedLoyaltyCard.objects.filter(
        user_id=user.id, venue=venue)
      is_point_valid = loyalty_card_validation_rule(
        scans, user, venue, venue_loyalty_point_rule)
      if is_point_valid:
         ItemisedLoyaltyCard.objects.create(
                    user_id=user.id, venue=venue, add_points=venue_loyalty_point_rule.points)
                # If creation succeeds, set data and break the loop
         data = {'points': venue_loyalty_point_rule.points, 'user': user.id, 'venue': venue.name,
                        'success': is_point_valid, 'frequency_rule': venue_loyalty_point_rule.frequency}
      else:
        print("Invalid loyalty card validation rule.")
        data = {'error': 'Invalid loyalty card validation rule.'}
                    
                
    except ObjectDoesNotExist:
      # code flow continue here if venue id does not exist
      print("Retrying")
      
   return HttpResponse(json.dumps(data), content_type="application/json")
 Обратите внимание, что я проигнорировал реализованную вами систему подсчета повторных попыток, просто потому, что нет смысла повторять попытку создания еще одного нового объекта ItemisedLoyalityCard, если venue все еще не существует.
Надеюсь, это помогло!