Python Django立即保存并返回对象(使用自定义主键)

Python Django立即保存并返回对象(使用自定义主键),python,django,database,django-models,django-queryset,Python,Django,Database,Django Models,Django Queryset,我正在使用自定义创建方法create\u actor创建模型对象,如下所示: class ActorsManager(models.QuerySet): def create_actor(self, email, actortype, locationid, primaryphone, actoruniversalid): actor = self.model(email=email, actorty

我正在使用自定义创建方法
create\u 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\u条目
变量中获取最近创建的对象, 可能是我做错了什么,请帮忙

我使用before insert SQL触发器在数据库中生成uuid作为pk(这里是CharField),因此对象在保存之前确实有一个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
表,否则不会自动设置
ActorID
。根据您的数据库后端,
None
可能被视为与空字符串相同,因此可能是有效的主键。我相信Django会采取特殊措施来更新具有相同主键的行,除非在调用
save()时指定

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

在搜索django文档之后,我找到了UUID的AutoField的替代品,它最适合我的用例

actorid = models.UUIDField(db_column='ActorID', primary_key=True, editable=False, default=uuid.uuid4)
因此,现在django确实知道pk,因此对象在保存后被检索


谢谢大家的帮助。

您得到了什么?是空对象还是其他对象?它是Actors对象的一个实例,但具有我给定的字段,即email=''、actortype=1、actorid(这里的pk)=''。但不是在保存后返回的,因为它应该给出pk。你能显示你的模型吗?@knbk model在问题中添加。所以你的db记录有一个pk。这不会改变您没有使用
自动字段的事实,因此,检索pk的python逻辑不会执行。最好从参与者id中删除
primary\u key=True
,然后迁移,以便pk是自动递增整数,并在save@joelgoldstick我通过数据库中定义的before insert SQL触发器将pk生成为uuid。因此,对象将以uuid保存为pk,而不是None@KapilSachdev:是的,但Django不知道。@RemcoGerlich,你是对的,我不知道这个事实,直到knbk在评论中指出。