#django #postgresql
#django #postgresql
Вопрос:
Возможно ли написать модель Django с полем, которое использует функцию PostgreSQL в качестве значения по умолчанию? Вот простой пример использования txid_current() в качестве значения по умолчанию:
% psql
mydb=# CREATE TABLE test (
label text default '',
txid BIGINT DEFAULT txid_current()
);
CREATE TABLE
mydb=# d test
Table "public.test"
Column | Type | Modifiers
-------- -------- ------------------------
label | text | default ''::text
txid | bigint | default txid_current()
mydb=# INSERT INTO test (label) VALUES ('mylabel');
INSERT 0 1
mydb=# select * from test;
label | txid
--------- --------
mylabel | 192050
(1 row)
Модель Django для этой таблицы может выглядеть следующим образом
class Test(models.Model):
label = TextField('Label', default='')
txid = BigIntegerField('txid', default=???)
Есть ли способ указать функцию базы данных в качестве значения по умолчанию или мне нужно добавить значение по умолчанию в PostgreSQL отдельным шагом после запуска syncdb?
Ответ №1:
Вы можете указать вызываемое поле как «по умолчанию»https://docs.djangoproject.com/en/dev/ref/models/fields/#default
и позвольте вызываемому объекту выполнить необработанный SQL, чтобы получить нужное вам значениеhttps://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly
Что касается вашего txid_current(), обязательно прочитайте https://docs.djangoproject.com/en/dev/topics/db/transactions/#django-s-default-transaction-behavior
Комментарии:
1. Как мне получить базу данных, которую я должен использовать для выполнения функции?
Ответ №2:
Вы должны сделать это в SQL самостоятельно. Django это не поддерживает. Это особенность независимости от базы данных.
Комментарии:
1. Спасибо. Я когда-либо использовал PostgreSQL только с Django, но знал, что у MySQL и sqlite есть функции. Теперь я вижу, что MySQL не допускает функции в качестве значений по умолчанию, поэтому мой пример действительно был бы специфичным для PostgreSQL. Возможность передать некоторые дополнительные сведения для вставки в инструкцию CREATE TABLE, в зависимости от того, что понимает ваш сервер, показалась правдоподобной.