【问题标题】:Django save and return object at once (with a custom pk)Django 一次保存并返回对象(使用自定义 pk)
【发布时间】:2016-11-11 01:13:06
【问题描述】:

我正在使用自定义创建方法 create_actor 创建模型对象,如下所示:

class ActorsManager(models.QuerySet):
    def create_actor(self, email,
        actortype,
        locationid,
        primaryphone, actoruniversalid):
        actor = self.model(email=email,
            actortype=actortype,
            locationid = locationid,
            primaryphone=primaryphone, actoruniversalid= actoruniversalid)

        actor.save(using='gpr')
        return actor

actor_entry = Actors.objects.using('gpr').create_actor(email='', actortype=1, locationid = location_entry,primaryphone='', actoruniversalid= new_bluenumber)

我没有在actor_entry 变量中获取最近创建的对象, 可能是我做错了什么,请帮忙。

我使用 before insert SQL 触发器在数据库中生成 uuid 作为 pk(CharField here),因此该对象在保存之前确实有一个 pk(由数据库生成)。

演员模型

class Actors(models.Model):
    actorid = models.CharField(db_column='ActorID', primary_key=True, max_length=255)  # Field name made lowercase.
    actoruniversalid = models.CharField(db_column='ActorBluenumber', unique=True, blank=True, null=True, max_length=254)
    ......
    ......
    objects = ActorsManager.as_manager()

    class Meta:
        managed = False
        db_table = 'actors'

【问题讨论】:

  • 你得到了什么?是空对象还是别的什么?
  • 它是 Actors 对象的一个​​实例,但具有我给出的字段,即 email='',actortype=1, actorid(pk here)=' '。但不是保存后返回的那个,因为它应该给 pk。
  • 你能展示你的模型吗?
  • @knbk 模型已添加到问题中。
  • 所以你的数据库记录有一个pk。这不会改变您没有使用AutoField 的事实,因此不会执行检索 pk 的 python 逻辑。

标签: python django database django-models django-queryset


【解决方案1】:

除非您手动创建了actors 表,否则ActorID 不会自动设置。根据您的数据库后端,None 可能被视为与空字符串相同,因此可能是有效的主键。我相信如果存在具有相同主键的行,Django会采取特殊措施更新行,除非您在调用save()时指定forceinsert=True

【讨论】:

  • 最好从actor id 中删除primary_key = True 并迁移,以便pk 是自动增量整数并在保存时创建
  • @joelgoldstick 我通过数据库中定义的 before insert SQL 触发器将 pk 生成为 uuid。所以对象被保存为 uuid 为 pk 并且不是 None
  • @KapilSachdev:是的,但 Django 不知道。
  • @RemcoGerlich,你说得对,我不知道这个事实,直到 knbk 在 cmets 中指出。
【解决方案2】:

正如@knbk 指出的那样,只有 AutoField 可以将 pk 设置为对象,因此当它不是 AutoField 时,检索 pk 的 pythonic 逻辑不会执行,因此 django 不知道关于它。

搜索 django 文档后,我找到了 AutoField for UUID 的替代方法,UUIDField 最适合我的用例。

actorid = models.UUIDField(db_column='ActorID', primary_key=True, editable=False, default=uuid.uuid4)

所以现在 django 确实知道 pk,因此对象在保存后被检索。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2021-01-10
    • 2016-11-20
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2016-09-05
    • 2018-11-14
    相关资源
    最近更新 更多