2016-07-08 40 views
2

我創建使用自定義創建方法create_actor這樣的模型對象:Django的保存,並立即返回對象(自定義PK)

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 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' 
+0

你得到了什麼*是一個空對象還是其他的東西? – solarissmoke

+0

它是Actors對象的一個​​實例,但是我給出的字段是** email ='',actortype = 1,actorid(pk here)=''**。但不是保存後返回的那個,因爲它應該給pk。 – kapilsdv

+0

你能展示你的模型嗎? – knbk

回答

0

除非您創建actors表按另一方面,ActorID不會被自動設置。根據您的數據庫後端,None可能被視爲與空字符串相同,因此可能是有效的主鍵。我相信Django的採取特別措施,以更新的行,如果一個具有相同主鍵存在,除非你調用save()

+0

可能更好地從主角色id中移除'primary_key = True'並遷移,以便pk是自動增量整數,並在保存時創建 –

+0

@joelgoldstick我通過_before insert_SQL觸發器生成** pk **作爲** uuid **數據庫。所以對象被保存爲uuid,而不是無 – kapilsdv

+0

@KapilSachdev:是的,但是Django不知道這一點。 – RemcoGerlich

0

當作爲@knbk指出,只有一個下拉列表AutoField可的PK設置爲一個對象,所以這個Python的指定forceinsert=True檢索pk的邏輯在其不是AutoField時不會執行,因此django不知道它。

在搜索了django文檔後,我發現了一個替代AutoField for UUID的UUIDField,它最適合我的用例。

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

所以現在django確實知道pk,因此在保存後檢索對象。

謝謝大家的幫助。