Я интегрирую Django со таблицей внутри существующей базы данных Oracle, которая имеет уже созданную последовательность и ее PK (числовая). То, что я хочу достичь, - это возможность создавать новые строки для этой таблицы с использованием текущей последовательности. Как я могу это сделать?Как использовать пользовательскую последовательность Oracle для Django Model PK?
0
A
ответ
-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)
Как объявить последовательность использовать для заполнения поля? –
Адам, используя управляемую таблицу Django, структура создаст и свяжет требуемую последовательность в Oracle. Нет необходимости вводить код отдельно. Мое предложение предназначалось только для использования с неуправляемыми таблицами, которые уже имеют настройку последовательности. – Dashdrum
Мой вопрос был более «С неуправляемой таблицей, как вы генерируете новые значения последовательности и вставляете их». До сих пор я видел людей, использующих триггеры вставок, чтобы обновить столбец из последовательности, но я надеялся увидеть лучший способ внутри django. –