Django/Heroku - 将数据从 API 推送到 Django 数据库时处理 ObjectDoesNotExist 异常

问题描述 投票:0回答:1

我的 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")
django
1个回答
0
投票

事实上,您的模型字段中有

blank = True
null = True
,这意味着当您创建 db/model 对象时,它将接受空数据而不会引发错误。

仅供参考:

blank = True
表示表单中的数据可以为空

null = True
将在数据库本身中设置
NULL
(允许为空)。

© www.soinside.com 2019 - 2024. All rights reserved.