我有一个模特:
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级别上设置此约束,并正在考虑将用户字段更改为不可为空,而改为使用默认用户。
但是我觉得创建默认用户可能会带来某种安全后果。
所以我的问题是:这是创建这样一个标记/默认用户对象的良好实践(或根本不实践)?有任何警告/安全风险吗?
答案 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),
)
所以我想在数据库中有一个哨兵用户是可以的。