Django一次保存并返回对象(使用自定义pk)

时间:2016-07-08 12:49:04

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

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

我在插入 SQL触发器之前使用在数据库中生成uuid为pk(此处为CharField),因此该对象在保存之前确实有一个pk(由数据库生成)。 / p>

演员模特

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'

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

在搜索django文档后,我找到了一个替代AutoField for UUIDs的UUIDField,它最适合我的用例。

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

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

谢谢大家的帮助。