【问题标题】:django - get_or_create() is not saving to sqlite dbdjango - get_or_create() 没有保存到 sqlite db
【发布时间】:2014-09-10 15:56:21
【问题描述】:

我试图在一个循环中保存多个对象。

for i in range(0,12):
        some_url = "blabla.com/signnum=" + str(i)
        req = urllib2.Request(astro_url,headers=hdr)
        str_response = urllib2.urlopen(req)
        json_str = json.load(str_response)
        with transaction.atomic():
            if i == 0:
                capricorn, cp_created = Capricorn.objects.get_or_create(astro_date=json_str['daily']['data_date'],
                        defaults={
                                  'headline': json_str['daily']['headline'],
                                  'headcontent':json_str['daily']['content'],
                                  'rating':json_str['daily']['rating'],
                                  'love_rate':json_str['daily']['love'],
                        })
                if cp_created:
                    print 'Capricorn saved'
                else:
                    print 'Capricorn is already in db'
            if i == 1:
                #different model
            if i == 2:
                #different model
            ....
            ....

这种情况一直持续到 12 日。相同的字段只有不同的型号名称。

我遇到的问题是最后的第 12 个对象没有被插入到数据库中,尽管

if last_created:
     print last_createdobj.id
     print 'LastModelObject saved'
else:
     print 'LastModelObject is already in db'

正在打印1LastModelObject saved。正在插入所有其他对象。

这里发生了什么?循环实际上循环了 12 次。写入数据库是原子的。这里有什么不好的?我真的卡住了。。

我正在使用 sqlite (dev),它正在打印 db 中不存在的 id 1,这是什么鬼?

【问题讨论】:

  • 假设检查 if i==0: 背后的逻辑是正确的,该函数是打印 Capricorn saved 还是 already in db ?你是如何计算last_created 对象的?
  • @karthikr 是的,摩羯座只是第一个成功保存的模型,第 12 个模型i==11 没有被保存,尽管它说lastmodelobject is saved
  • 那你为什么有if i == 0:呢?摆脱它。由于该检查,所有这些代码都不会在循环中的第一次迭代之后执行。
  • @karthikr last_created 也与这里给定的摩羯座相同。只是型号名称不同。我只是没有发布那么多代码
  • 没有代码,可能很难推测,但看起来你在做不必要的繁重工作。这是一个更简单的模型。 gist.github.com/karthikbgl/…这样,你可以轻松调试,代码在一个地方。

标签: python django sqlite


【解决方案1】:

我建议更改模型结构,而不是 12 个 if 语句和 12 个不同的模型。 Something like this:

#models.py

CAPRICORN = 'Capricorn'
AQUARIUS = 'Aquarius'
PISCES = 'Pisces'
ARIES = 'Aries'
TAURUS = 'Taurus'
GEMINI = 'Gemini'
CANCER = 'Cancer'
LEO = 'Leo'
VIRGO = 'Virgo'
LIBRA = 'Libra'
SCORPIO = 'Scorpio'
SAGITTARIUS  = 'Sagittarius'

SIGN_CHOICES = (
    (1, CAPRICORN,
     2, AQUARIUS,
     3, PISCES,
     4, ARIES,
     5, TAURUS,
     6, GEMINI,
     7, CANCER,
     8, LEO,
     9, VIRGO,
     10, LIBRA,
     11, SCORPIO,
     12, SAGITTARIUS)
  )

class Sign(models.Model):
    signtype = models.CharField(choice=SIGN_CHOICES)
    astro_date = models.DateField() 
    headline = models.CharField(max_length=255)
    headcontent = models.TextField()
    rating = RatingField()    
    love_rate = models.CharField(max_length=255)

在视图中,您只需将index+1 分配给signtypeget_or_create 就可以正常工作。

例子:

astro_date = json_str['daily']['data_date']
sunsign, created = Sign.objects.get_or_create(signtype=index+1, astro_date=astro_date,
                        defaults={
                                  'headline': json_str['daily']['headline'],
                                  'headcontent':json_str['daily']['content'],
                                  'rating':json_str['daily']['rating'],
                                  'love_rate':json_str['daily']['love'],
                        })

这样,您的代码更简洁,更易于调试。

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多