django: как сделать так, чтобы столбцы таблицы в базе данных имели значения по умолчанию ИЛИ получить значения по умолчанию программно - PullRequest
1 голос
/ 13 сентября 2011

У меня есть следующая модель:

class League(models.Model):
    sport = models.ForeignKey(Sport)
    name = models.CharField(max_length=100, unique=True)
    show = models.BooleanField(default=False)
    display_name = models.CharField(max_length=100, blank=True, default="")

    #display with smallest numbers first.
    display_order = models.IntegerField(default=1000)

Но столбцы базы данных не имеют значений по умолчанию:

sportsite=> \d app_league
                                    Table "public.app_league"
    Column     |          Type          |                        Modifiers
---------------+------------------------+---------------------------------------------------------
 id            | integer                | not null default nextval('app_league_id_seq'::regclass)
 name          | character varying(100) | not null
 show          | boolean                | not null
 display_name  | character varying(100) | not null
 sport_id      | integer                | not null
 display_order | integer                | not null
Indexes:
    "app_league_pkey" PRIMARY KEY, btree (id)
    app_league_name_uniq" UNIQUE, btree (name)
    app_league_sport_id" btree (sport_id)
Foreign-key constraints:
    "sport_id_refs_id_27250fc5" FOREIGN KEY (sport_id) REFERENCES app_sport(id) DEFERRABLE INITIALLY DEFERRED

Это проблема, потому что я хочу использовать массовые вставки, например составив запрос, который выглядит следующим образом:

INSERT INTO app_league (sport_id, name)
(
    SELECT i.sport_id, i.name
    FROM (VALUES (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s
, %s), (%s, %s), (%s, %s), (%s, %s)) AS i(sport_id, name)
    LEFT JOIN app_league as existing
      ON (existing.sport_id = i.sport_id AND existing.name = i.name)
    WHERE existing.id IS NULL
)

Я хочу вставить его, только если комбинация (sport_id, league) не существует, со значениями по умолчанию, указанными в django ... если значения по умолчанию были в базе данных SQL, то, похоже, этот запрос будет работать.

Итак: есть ли способ заставить django создавать значения по умолчанию для таблиц sql? (Я также использую юг, если это имеет значение).

Если нет .. Я полагаю, что я могу изменить свой запрос, чтобы проверять только те поля, которые имеют значение ON, но указать значения по умолчанию в части VALUES ... в таком случае, как я могу получить значение поля по умолчанию программно, так что мой код массовой вставки не должен дублировать эти значения?

1 Ответ

0 голосов
/ 13 сентября 2011

Django не поддерживает передачу значения по умолчанию в серверную часть базы данных (см. # 470 «значения по умолчанию» должны быть выражены в схеме SQL ). Однако вы должны иметь возможность вручную ввести команду update table в пользовательском файле sql , который устанавливает значение по умолчанию для столбца.

...