django中的默认用户(前哨值)

时间:2019-03-29 16:22:19

标签: python django postgresql

我有一个模特:

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和user都相同,在两种情况下都是NULL。

我认为在创建这些对象的任何地方使用NotificationSettings.objects.get_or_create()就足够了,但是我猜想当两个请求几乎同时到达端点时会出现竞争,并且无论如何我都会重复。 >

这就是为什么我想在PostgreSQL级别上设置此约束,并正在考虑将用户字段更改为不可为空,而改为使用默认用户。

但是我觉得创建默认用户可能会带来某种安全后果。

所以我的问题是:这是创建这样一个标记/默认用户对象的良好实践(或根本不实践)?有任何警告/安全风险吗?

1 个答案:

答案 0 :(得分:0)

我在django docs中偶然发现了这一点:

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models

def get_sentinel_user():
    return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET(get_sentinel_user),
    )

所以我想在数据库中有一个哨兵用户是可以的。