2016-12-12 3 views
0

Я интегрирую Django со таблицей внутри существующей базы данных Oracle, которая имеет уже созданную последовательность и ее PK (числовая). То, что я хочу достичь, - это возможность создавать новые строки для этой таблицы с использованием текущей последовательности. Как я могу это сделать?Как использовать пользовательскую последовательность Oracle для Django Model PK?

ответ

-1

Я решил эту проблему на основе this gist, изменил идентификатор рк обозначения так, что она может быть использована в общем:

# your_app/models.py 

def update_pk(func): 
'''A decorator for pulling a data objects PK value out of a 
    user-defined sequence. This gets around a limitation in 
    django whereby we cannot supply our own sequence names.''' 

    def decorated_function(*args): 
     # Grab a reference to the data object we want to update. 
     data_object = args[0] 

     # Only update the PK if there isnt one yet. 
     if data_object.pk is None: 
      # Construct the new sequence name based on the tables meta data. This might be different depending on your needs 
      sequence_name = 'seq_%s' % data_object._meta.db_table 

      # Query the database for the next sequence value. 
      from django.db import connection 
      cursor = connection.cursor() 
      cursor.execute("SELECT %s.nextval FROM DUAL;" % (sequence_name)) 
      row = cursor.fetchone() 

      # Update the data objects PK with the returned sequence value. 
      data_object.pk = row[0] 

     # Execute the function were decorating. 
     return func(*args) 

    return decorated_function 


# Example model using the decorator to grab the PK. 
class FAQ(models.Model): 
    id = models.IntegerField(primary_key=True) 
    category = models.ForeignKey(FAQCategory) 
    question = models.CharField(maxlength=255) 
    answer = models.TextField() 
    published = models.BooleanField(default=False) 
    list_ordering = models.FloatField(max_digits=6, decimal_places=2, default=9999) 

    def __str__(self): 
     return self.question 

    @update_pk 
    def save(self): 
     # Now actually save the object. 
     super(FAQ, self).save() 

    class Meta: 
     db_table = 'faqs' 
0

Я просто побежал в эту последнюю неделю. Моя таблица определена с помощью managed = false в Meta, а последовательность Oracle используется для обеспечения значения первичного ключа. Для того, чтобы сказать, Django, чтобы получить значение ключа после того, как строка сохраняется, объявить столбец как AutoField:

surrogate_id = models.AutoField(primary_key=True,blank=True) 
+0

Как объявить последовательность использовать для заполнения поля? –

+0

Адам, используя управляемую таблицу Django, структура создаст и свяжет требуемую последовательность в Oracle. Нет необходимости вводить код отдельно. Мое предложение предназначалось только для использования с неуправляемыми таблицами, которые уже имеют настройку последовательности. – Dashdrum

+0

Мой вопрос был более «С неуправляемой таблицей, как вы генерируете новые значения последовательности и вставляете их». До сих пор я видел людей, использующих триггеры вставок, чтобы обновить столбец из последовательности, но я надеялся увидеть лучший способ внутри django. –

 Смежные вопросы

  • Нет связанных вопросов^_^