2016-07-08 1 views
2

я создаю объект модели, используя пользовательский метод создания 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 (сгенерированный базой данных).

Актеры Модель

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

Что вы * получаете? Is - нулевой объект или что-то еще? – solarissmoke

+0

Его экземпляр объектов Actors, но с полями, которые я дал i.e ** email = '', actortype = 1, actorid (pk here) = '' **. Но не тот, который вернулся после сохранения, так как тогда он должен дать pk. – kapilsdv

+0

Можете ли вы показать свою модель? – knbk

ответ

0

Если вы не создали actors таблицу вручную, то ActorID не будет автоматически установлен. В зависимости от базы данных базы данных None может обрабатываться так же, как пустая строка, и как таковой может быть действительным первичным ключом. Я считаю, что Джанго принимает специальные меры, чтобы обновить строку, если она существует с таким же первичным ключом, если не указана forceinsert=True при вызове save()

+0

Наверное, лучше удалить 'primary_key = True' из идентификатора актера и перенести так, чтобы pk был автоинкрементным целым и был создан при сохранении –

+0

@joelgoldstick. Я генерирую ** pk ** как ** uuid ** через триггер _before insert_ SQL, определенный в базы данных. Таким образом, объект сохраняется с uuid как pk и НЕ является None – kapilsdv

+0

@KapilSachdev: да, но Django этого не знает. – RemcoGerlich

0

Как @knbk отметил, что только AutoField может установить рк к объекту и так в вещих Логика для извлечения pk не выполняется, когда ее не является AutoField, и поэтому django не знает об этом.

После поиска документации django я нашел альтернативу AutoField для UUID, UUIDField, который лучше всего подходит для моего варианта использования.

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

Итак, теперь django знает о pk и, следовательно, объект извлекается после сохранения.

Спасибо всем за помощь.