Пользователь по умолчанию в django (значение sentinel) - PullRequest
2 голосов
/ 29 марта 2019

У меня есть модель:

class NotificationSettings(models.Model):
    android_device = models.ForeignKey(
        'users.AndroidDevice',
        default=None,
        null=True,
        blank=True,
        on_delete=models.SET_NULL
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True)
    ...
    class Meta:
        unique_together = ("user", "android_device")

Моя проблема в том, что у меня есть unique_together для полей, которые можно обнулять. Я узнал, что в PostgreSQL (и, как правило, в стандарте SQL) NULL! = NULL, поэтому я могу получить, например, два объекта NotificationSettings, которые имеют одинаковый device_id, а в обоих случаях пользователь имеет значение NULL.

Я думал, что использования NotificationSettings.objects.get_or_create() везде, где я создаю эти объекты, будет достаточно, но я предполагаю, что есть условие гонки, когда два запроса достигают конечной точки почти в одно и то же время, и я в любом случае получаю дубликаты.

Вот почему я хотел установить это ограничение на уровне PostgreSQL и думал о том, чтобы изменить поле пользователя так, чтобы оно не обнулялось, и вместо этого иметь пользователя по умолчанию.

Но я чувствую, что создание пользователя по умолчанию может иметь некоторые последствия для безопасности.

Итак, мой вопрос: является ли это хорошей практикой (или практикой вообще) для создания такого объекта-дозорного / стандартного пользователя? Есть ли какие-либо предостережения / угрозы безопасности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...