Django: сделать столбец, который не является уникальным первичным ключом

У меня есть список числовых codes с соответствующим мнемоническим names, и я хочу иметь для них модель Django, чтобы names были первичными ключами, но также есть ограничение, что значения в столбце code уникальны.

Я пробовал следующее:

class Constant(models.Model):
    name = models.CharField(max_length=70)
    name.primary_key = True
    code = models.IntegerField()
    description = models.CharField(max_length=100)

    unique_together = (("code",),)

Я понимаю, что unique_together предназначен для обеспечения уникальности значений в наборе столбцов, но я подумал, что попробую только с одним, и это, похоже, сработало, т.е. без ошибок при выполнении python manage.py syncdb, но на самом деле это не обеспечивает ограничение, которое я хочу :

mysql> describe constant;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| name        | varchar(70)  | NO   | PRI |         |       |
| code        | int(11)      | NO   |     |         |       |
| description | varchar(100) | NO   |     |         |       |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> insert into constant values ('x',1,'fooo');
Query OK, 1 row affected (0.00 sec)

mysql> insert into constant values ('y',1,'foooo');
Query OK, 1 row affected (0.00 sec)

Что я могу сделать, чтобы убедиться, что значения в обоих столбцах уникальны?


person piokuc    schedule 20.08.2013    source источник
comment
Почему бы просто не указать unique=True в определении поля (а primary_key=True должно быть в определении поля name, а не назначено впоследствии).   -  person Daniel Roseman    schedule 20.08.2013
comment
Да, это подействовало! Спасибо большое. По какой-то причине я не смог найти это довольно очевидное решение через Google. Почему бы вам не поставить это как ответ? Спасибо еще раз.   -  person piokuc    schedule 20.08.2013


Ответы (1)


Добавьте уникальную опцию в поле кода.

class Constant(models.Model):
    name = models.CharField(max_length=70, primary_key=True)
    code = models.IntegerField(unique=True)
    description = models.CharField(max_length=100)
person garnertb    schedule 20.08.2013