Django - Inspectdb поддерживает этот вид таблиц базы данных? - PullRequest
1 голос
/ 04 ноября 2011

Я проверил "inspectdb", но я думаю, что моя схема слишком сложна, например ... для таблицы "tdir_files_context" (djangoinspectdb.JPG "image in attachment") Я получил эту модель:

class TdirFilesContext(models.Model):
   id_category = models.ForeignKey(TdirCategories, db_column='id_category')
   id_file_context = models.CharField(max_length=20)
   n_file_context = models.CharField(max_length=150)
   coment = models.CharField(max_length=2000)
   id_user_db_ins = models.CharField(max_length=45)
   id_user_db_upd = models.CharField(max_length=45)
   id_user_sys_ins = models.CharField(max_length=45)
   id_user_sys_upd = models.CharField(max_length=45)
   date_ins = models.DateTimeField()
   date_last_upd = models.DateTimeField()
   class Meta:
       db_table = u'tdir_files_context'

Эта таблица базы данных имеет два первичных ключа и один внешний ключ.Модель Django обрабатывает таблицы базы данных такого типа?

enter image description here

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Во-первых, ни у одной таблицы не может быть двух первичных ключей. Это просто невозможно. Я просто предположу, что у вас есть первичный ключ, состоящий из двух столбцов, id_category и id_file_context.

К сожалению, в настоящее время Django не поддерживает модели с составными первичными ключами, он может обрабатывать таблицы только с одним столбцом в качестве первичного ключа.

<plug type="shameless"> В настоящее время ведется работа над тем, чтобы сделать это возможным с Django, см. https://code.djangoproject.com/ticket/373 и мои работы по этому вопросу с прошлого Google Summer of Code: https://github.com/koniiiik/django </plug>

Однако, кроме этого, ForeignKey s прекрасно подходят для Django, и я не вижу других проблем с вашим столом.

2 голосов
/ 04 ноября 2011

koniiiik только что принес очень интересный ответ о составных первичных ключах.

Но когда я вижу ваше определение модели, я не уверен, что вам действительно нужны два первичных ключа, а только один внешний ключ и один первичный ключ как:

class TdirCategories(models.Model):
   id_category = models.AutoField(primary_key=True)

class TdirFilesContext(models.Model):
   id_category = models.ForeignKey(TdirCategories, db_column='id_category')
   id_file_context = models.AutoField(primary_key=True)
   n_file_context = models.CharField(max_length=150)
   coment = models.CharField(max_length=2000)
   id_user_db_ins = models.CharField(max_length=45)
   id_user_db_upd = models.CharField(max_length=45)
   id_user_sys_ins = models.CharField(max_length=45)
   id_user_sys_upd = models.CharField(max_length=45)
   date_ins = models.DateTimeField()
   date_last_upd = models.DateTimeField()
   class Meta:
       db_table = u'tdir_files_context'

команда python manage.py syncdb хорошо ее выполняет и после python manage.py name_of_your_app_containing_the_model sql

Вы получите правильное:

BEGIN;
CREATE TABLE "app_tdircategories" (
    "id_category" integer NOT NULL PRIMARY KEY
)
;
CREATE TABLE "tdir_files_context" (
    "id_category" integer NOT NULL REFERENCES "app_tdircategories" ("id_category"),
    "id_file_context" integer NOT NULL PRIMARY KEY,
    "n_file_context" varchar(150) NOT NULL,
    "coment" varchar(2000) NOT NULL,
    "id_user_db_ins" varchar(45) NOT NULL,
    "id_user_db_upd" varchar(45) NOT NULL,
    "id_user_sys_ins" varchar(45) NOT NULL,
    "id_user_sys_upd" varchar(45) NOT NULL,
    "date_ins" datetime NOT NULL,
    "date_last_upd" datetime NOT NULL
)
;
COMMIT;

надеюсь, это поможет:)

...