【问题标题】:Save Duplicate Data At SQLITE DB When Refresh the Browser刷新浏览器时在 SQLITE DB 中保存重复数据
【发布时间】:2021-08-07 01:24:48
【问题描述】:

基本上,我正在编写一个调用第三方免费 API 的 Django 应用程序。取到后 来自 API 的数据,我正在尝试将数据保存到 Django 模型中。我创建了一个用于存储 API 数据的模型。 在 Django SQLITE DB 中保存数据后,当我刷新浏览器时,完全相同的数据再次保存在 SQLITE 数据库表中。我怎样才能防止这个问题?

我心中的一个逻辑:
如果数据存在则无需插入 否则插入

但我无法在 Django 视图中应用此逻辑,因为不知道如何操作?

模型.py

from django.db import models

# Create your models here.
class DogFacts(models.Model):
    fact = models.CharField(max_length=100)

    def __str__(self):
        return self.fact

views.py

def api(request):

    url = 'https://dog-facts-api.herokuapp.com/api/v1/resources/dogs/all'
    response = requests.get(url)
    json_response = response.json()

    # save all dog facts in the db
    for i in json_response:
        dog_facts = DogFacts(fact= i.get("fact"))
        dog_facts.save()
    return redirect('api')

谢谢。

【问题讨论】:

    标签: python-3.x django api django-models django-views


    【解决方案1】:

    我可以通过两种方式来考虑。
    1 - 在事实字段中将唯一更改为 True (https://docs.djangoproject.com/en/3.2/ref/models/fields/#unique)
    2 - 每次调用 api 时检查。
    1:

    from django.db import models
    
    # Create your models here.
    class DogFacts(models.Model):
        fact = models.CharField(max_length=100, unique=True)
    
        def __str__(self):
            return self.fact
    
    def api(request):
    
        url = 'https://dog-facts-api.herokuapp.com/api/v1/resources/dogs/all'
        response = requests.get(url)
        json_response = response.json()
    
        # save all dog facts in the db
        for i in json_response:
            try:
                dog_facts = DogFacts(fact= i.get("fact"))
                dog_facts.save()
            except Exception as e:
                print(e)
        return redirect('api')
    

    或 2:

        from django.db import models
        
        # Create your models here.
        class DogFacts(models.Model):
            fact = models.CharField(max_length=100)
        
            def __str__(self):
                return self.fact
    
        def api(request):
        
            url = 'https://dog-facts-api.herokuapp.com/api/v1/resources/dogs/all'
            response = requests.get(url)
            json_response = response.json()
        
            # save all dog facts in the db
            for i in json_response:
                dog_facts = DogFacts.objects.filter(fact= i.get("fact"))
                if len(dog_facts) == 0:
                    dog_facts = DogFacts(fact= i.get("fact"))
                    dog_facts.save()
    
            return redirect('api')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 2013-03-06
      相关资源
      最近更新 更多