class Author(models.Model):
...
class Book(models.Model):
author = models.ForeignKey(Author)
book_seq = models.PositiveIntegerField()
class Meta:
unique_together = ('author', 'book_seq')
def create_book_for_author(cls, author):
book_seq = Book.objects.filter(author=author).count() + 1
Book.objects.create(author=author, book_seq=book_seq)
Есть ли способ сослаться на это book_seq = Book.objects.filter(author=author).count() + 1
на уровне базы данных, потому что если эта строка одновременно, то уникальное ограничение не будет выполнено, а второе, достигшее базы данных с запросом на вставку, потерпит неудачу. Я знаю, что одним из вариантов является транзакция, но есть ли другой способ? F()
объект работает только с конкретным полем, а не с запросом к базе данных.