Django: Атомарное чтение нескольких полей модели

У меня есть следующие модели Django и простая функция, которая обращается к базе данных:

class Shape(models.Model):
    color = models.CharField()
    name = models.CharField()


class Point(models.Model):
    x = models.FloatField()
    y = models.FloatField()
    shape = models.ForeignKey(Shape, on_delete=models.CASCADE, related_name="points")


def some_access(id):
    shape = Shape.objects.get(pk=id)
    return shape.color, shape.name, list(shape.points.all())

Мои вопросы следующие:

  1. В fn some_access: Являются ли значения color, name и points считываются в одной и той же sql-транзакции? Если нет, то может возникнуть гонка условие (чтение формы, изменение записи базы данных в другом месте, чтение точек)

  2. Если нет, то как я могу добиться того, чтобы доступ к различным атрибутам (на одной модели или на объекте с внешним ключом - например, значения x и y точек) считывались атомарно?

  3. Если используется transaction.atomic. Означает ли это, что она блокирует базу данных и выполняет множественные обращения к базе данных, что может вызвать проблему n+1?

  4. Единственное, что я могу придумать для вопроса 2, это обернуть все в transaction.atomic.

    Вернуться на верх