开发者

django: how to make table columns in the database have defaults OR get defaults programmatically

I have the following model:

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)

But the database columns have no defaults:

sportsite=> \d app_league
                                    Table "public.app_league"
    Column     |          Type          |                        Modifiers
---------------+------------------------+---------------------------------------------------------
 id            | integer                | not null default nextval('app_league_id_seq'::regclass)
 name          | characte开发者_高级运维r 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

This is a problem, because I want to use bulk inserts, e.g. by formulating a query that looks like this:

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
)

I only want to insert it if the (sport_id, league) combination doesn't exist, with the default values as specified in django.. if the defaults were in the SQL database, then it seems this query would work.

So: is there a way to get django to create defaults on the sql tables? (I'm also using south, if that makes a difference).

If not.. I suppose I can modify my query to only check for the fields that matter with the ON, but to specify the defaults in the VALUES part... in that case, how can I get the default value of a field programmatically, so that my bulk-insert code doesn't need to duplicate those values?


Django does not support passing the default value to the database backend (see #470 "default" values should be expressed in SQL schema). However, you should be able to manually issue an update table command in a custom sql file, that installs the default value for the column.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜