#python #mysql #django #database #sqlite
#python #mysql #django #База данных #sqlite
Вопрос:
У меня есть класс модели, подобный этому:
class TestModel(models.Model):
class Meta:
unique_together = ('prefix', 'number')
prefix = models.CharField(max_length=30)
number = models.IntegerField()
префикс и число вместе образуют естественный ключ для моей модели, но мне все равно, какое это число. Таким образом, автоматическое увеличение (не для каждого префикса) было бы хорошо. Я не хочу указывать число, но я хочу иметь возможность (например, потому что существуют существующие пары префикс число, которые необходимо ввести в эту систему).
Например, в большинстве случаев я просто хочу использовать автоматическое увеличение:
'the_prefix', 1
'the_prefix', 2
Однако в некоторых случаях я могу захотеть использовать определенную комбинацию (префикс, число), например, пары (префикс, число) из устаревшей системы:
'manually', 2 # number is not unique alone...
'manually', 4 # ... or sequential
Насколько я понимаю,
- поддерживаются только одностолбцовые PK, поэтому я не могу использовать prefix number в качестве составного PK напрямую;
- автоинкрементируется только автоинкрементное поле, и для каждой модели может быть только одно автоинкрементное поле (и оно должно быть PK), поэтому я не могу автоматически увеличивать идентификатор и номер; и
- вместо того, чтобы делать префикс идентификатор уникальным вместе, не имеет смысла, поскольку идентификатор уже уникален сам по себе.
Есть ли способ добиться этого (или одно из моих утверждений неверно)? Если есть решение, не зависящее от базы данных, это, конечно, было бы предпочтительнее, но в противном случае SQLite (разработка) и MySQL (производство) наиболее важны для меня лично.
Также приветствуются обходные пути — я пытаюсь использовать PK как «default» для number, но
- сохранение пустого числа для указания значения по умолчанию отменяет ограничение уникальности и
- чтобы скопировать идентификатор, сначала нужно сохранить объект без номера. Я изо всех сил пытаюсь реализовать это таким образом, который кажется надежным и прозрачным для пользователя