Django "Singleton model" 存储用户设置
Django "Singleton model" to store user settings
我正在使用 Django 构建网络应用程序。我希望能够存储我的应用程序的最终用户设置。现在我使用的模型设置包含应用程序所需的所有内容。
看起来不错,但我认为这不是正确的方法,因为我的数据库中可能有第二行,但我不想要它。
我虽然考虑使用文件,但它不像数据库中的 table 那样容易管理。
有人可以帮我吗?
谢谢! :)
路易森
您可以将 user
字段标记为 unique=True
。这基本上就是 OneToOneField
field [Django-doc] 所做的。因此,这意味着用户最多 条相关记录:
from django.conf import settings
class UserSettings(models.Model):
user = <b>models.OneToOneField(</b>
settings.USER_MODEL,
on_delete=models.CASCADE
<b>)</b>
# …
如果您因此打算为同一用户插入第二行,则会引发错误(假定数据库强制执行此类约束,但几乎所有数据库都这样做)。此外,如果您使用表单,Django 也会进行此类验证。
如果我对你的问题的理解正确,你有兴趣通过 editable 管理你的 django 应用程序的设置,易于更新的界面。
django-constance. It can use your database or redis to store the settings, and it makes them editable through the django admin. You can look at the documentation here 实现了一种流行的现有方法。
最终,使用数据库 table 存储配置设置的方法很好。虽然只有一行的问题让人感觉很奇怪,所以 django-constance 的方法是使用 key/value 设计,其中每个单独的配置键在 table.
中都有自己的行
如果您为此使用管理员,则可以根据需要创建管理员 class 并将添加权限设置为 false。您可以覆盖 changelist_view 以重定向到唯一的预定义行,如下所示:
def changelist_view(self, request, extra_context=None):
return HttpResponseRedirect(reverse('admin:erpapp_rescompany_change' , kwargs={'object_id': ResCompany.objects.all().first().pk}))
我来晚了一点,但为什么不试试 post_save 信号呢?
models.py
class AppSettings(models.Model):
setting_1 = models.IntegerField()
setting_1 = models.IntegerField()
signals.py
from someapp.models import AppSettings
@receiver(post_save,
sender= AppSettings,
dispatch_uid="delete_any_new_records"
)
def delete_any_new_records(sender, instance, **kwargs):
if AppSettings.objects.all().count() > 1:
instance.delete()
将允许第一条记录,但所有后续添加新记录的尝试都将被删除。
我正在使用 Django 构建网络应用程序。我希望能够存储我的应用程序的最终用户设置。现在我使用的模型设置包含应用程序所需的所有内容。
看起来不错,但我认为这不是正确的方法,因为我的数据库中可能有第二行,但我不想要它。
我虽然考虑使用文件,但它不像数据库中的 table 那样容易管理。
有人可以帮我吗?
谢谢! :)
路易森
您可以将 user
字段标记为 unique=True
。这基本上就是 OneToOneField
field [Django-doc] 所做的。因此,这意味着用户最多 条相关记录:
from django.conf import settings
class UserSettings(models.Model):
user = <b>models.OneToOneField(</b>
settings.USER_MODEL,
on_delete=models.CASCADE
<b>)</b>
# …
如果您因此打算为同一用户插入第二行,则会引发错误(假定数据库强制执行此类约束,但几乎所有数据库都这样做)。此外,如果您使用表单,Django 也会进行此类验证。
如果我对你的问题的理解正确,你有兴趣通过 editable 管理你的 django 应用程序的设置,易于更新的界面。
django-constance. It can use your database or redis to store the settings, and it makes them editable through the django admin. You can look at the documentation here 实现了一种流行的现有方法。
最终,使用数据库 table 存储配置设置的方法很好。虽然只有一行的问题让人感觉很奇怪,所以 django-constance 的方法是使用 key/value 设计,其中每个单独的配置键在 table.
中都有自己的行如果您为此使用管理员,则可以根据需要创建管理员 class 并将添加权限设置为 false。您可以覆盖 changelist_view 以重定向到唯一的预定义行,如下所示:
def changelist_view(self, request, extra_context=None):
return HttpResponseRedirect(reverse('admin:erpapp_rescompany_change' , kwargs={'object_id': ResCompany.objects.all().first().pk}))
我来晚了一点,但为什么不试试 post_save 信号呢?
models.py
class AppSettings(models.Model):
setting_1 = models.IntegerField()
setting_1 = models.IntegerField()
signals.py
from someapp.models import AppSettings
@receiver(post_save,
sender= AppSettings,
dispatch_uid="delete_any_new_records"
)
def delete_any_new_records(sender, instance, **kwargs):
if AppSettings.objects.all().count() > 1:
instance.delete()
将允许第一条记录,但所有后续添加新记录的尝试都将被删除。