Вы хотите это ограничение на уровне базы данных. В противном случае вы столкнетесь с проблемой параллелизма, которую вы обсуждали. Решение состоит в том, чтобы обернуть всю транзакцию (чтение, увеличение, запись) в транзакцию.
Почему вы не можете использовать AutoField вместо PositiveIntegerField?
number = models.AutoField()
Однако в этом случае число почти наверняка будет равно yourmodel.id
, так почему бы просто не использовать это?
Edit:
О, я вижу, что вы хотите. Вам нужно числовое поле, которое не увеличивается, если не существует более одного экземпляра MyModel.business
.
Я бы по-прежнему рекомендовал просто использовать поле id
, если вы можете, так как оно обязательно будет уникальным. Если вы абсолютно не хотите этого делать (возможно, вы показываете этот номер пользователям), то вам нужно будет обернуть свой метод сохранения в транзакцию.
Подробнее о транзакциях вы можете прочитать в документации:
http://docs.djangoproject.com/en/dev/topics/db/transactions/
Если вы просто используете это, чтобы подсчитать, сколько экземпляров MyModel имеют FK to Business, вы должны сделать это как запрос, а не пытаться сохранить счет.