【问题标题】:objects instances returning none using django bulk_create() [duplicate]使用 django bulk_create() 不返回任何对象实例 [重复]
【发布时间】:2021-09-26 22:55:12
【问题描述】:

我正在尝试将数据批量插入数据库,但在附加这些实例后我发现它们没有

型号

 class Seekerskillset(models.Model):
        skill_set = models.ForeignKey(Skillset, on_delete=models.CASCADE)
        seeker = models.ForeignKey(SeekerProfile, on_delete=models.CASCADE)
        skill_level = models.CharField(max_length=25)
    
        class Meta:
            verbose_name = 'Seeker skill set'

我的看法

 for skill_nme, skill_lvl in zip(skill_name, skill_level):
        skill_set = Skillset.objects.get(skill_name=skill_nme)
        seeker_skll.append(Seekerskillset(
            skill_set=skill_set, skill_level=skill_lvl, seeker=user))
        print(seeker_skll)
  

    seeker_bulk = Seekerskillset.objects.bulk_create(seeker_skll)
    print('after insertion',seeker_bulk)
    return redirect('/users/dashboard')

追踪

<class 'seekerbuilder.models.SeekerProfile'>
[<Seekerskillset: Seekerskillset object (None)>, <Seekerskillset: Seekerskillset object (None)>, <Seekerskillset: Seekerskillset object (None)>, <Seekerskillset: Seekerskillset object (None)>]
after insertion [<Seekerskillset: Seekerskillset object (None)>, <Seekerskillset: Seekerskillset object (None)>, <Seekerskillset: Seekerskillset object (None)>, <Seekerskillset: Seekerskillset object (None)>]
[19/Jul/2021 14:27:12] "POST /users/app_det/ HTTP/1.1" 302 0
[19/Jul/2021 14:27:12] "GET /users/dashboard HTTP/1.1" 301 0

【问题讨论】:

  • None 是主键的值。在进行批量创建时,对于大多数数据库,它不会设置主键。

标签: django django-models django-views


【解决方案1】:

括号之间的项目(此处为(None))是对象的主键。因此,如果您不覆盖模型的 __str____repr__ 方法,它将打印:

pk)>

当为某些数据库执行.bulk_create(…) [Django-doc] 时,Django 能够检索主键,而对于其他数据库这是不可能的(例如,因为数据库不包含任何在创建对象时返回值的逻辑)。由the documentation指定:

如果模型的主键是AutoField,则主键属性只能在某些数据库上检索(当前为 PostgreSQL、MariaDB 10.5+ 和 SQLite 3.35+)。在其他数据库上,不会设置。

【讨论】:

  • 非常感谢!我很难理解
  • SQLite 还能用吗?我将它与 SQLite 一起使用,但不起作用。在 Django-doc 中它说“如果模型的主键是 AutoField,则只能在某些数据库(当前 PostgreSQL 和 MariaDB 10.5+)上检索主键属性。在其他数据库上,不会设置。”
  • @nogabemist:从 Django-4.0 开始,它将再次工作,如文档中所述:“添加了对 SQLite 3.35+ 上获取主键属性的支持。"
猜你喜欢
  • 2016-02-12
  • 2012-06-03
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多