【问题标题】:How to make a django model singleton如何制作 django 模型单例
【发布时间】:2022-10-23 22:45:47
【问题描述】:

我有存储文件和上传人的 django 模型,但我需要我的 django 模型是单例的,我该如何实现?

模型.py

class Mymodel(BaseModel):
     title = models.FileField(
        upload_to='',
        validators=[],
    )
     person_uploaded = models.Foreignkey()

【问题讨论】:

  • 要使其成为单例,您将使用OneToOne 字段,而不是ForeignKey,但您的模型无论如何都没有意义。外键用于哪个模型?
  • @Selcuk 帐户的数据位于其他模型中,因此是外键
  • 还有哪个型号?您没有将模型名称传递给 ForeignKey 构造函数(您的类名中也有错字)。

标签: python-3.x django-models django-rest-framework django-views django-templates


【解决方案1】:

我最初是通过架构来考虑这一点的,然后玩弄了一番。然后django给了我一个深刻的教训,你最好不要弄乱模型结构,用你通常使用的东西,否则可能会出错,所以我最终实现了这个:

import math
from django.db import models


# Create your models here.
class Constants(models.Model):
    pi = models.FloatField(default=math.pi)
    e = models.FloatField(default=math.e)

    @staticmethod
    def setup():
        try:
            Constants.objects.get(pk=1)
        except Constants.DoesNotExist:
            instance = Constants()
            instance.save()

    @staticmethod
    def instance():
        return Constants.objects.get(pk=1)
    
    # only create 1 and save 1 allowed, other abort
    def save(self, *args, **kwargs):
        if self._state.adding:
            try:
                Constants.objects.get(pk=1)
            except Constants.DoesNotExist:
                # create 1
                super().save(*args, **kwargs)
        else:
            # save 1
            super().save(*args, **kwargs)

它只允许pk=1 存在,并且始终使用该实例,您可以对其进行更新,并记住在部署到服务器后运行setup 来初始化第一个实例和default 值。这可以节省性能,并会导致任何错误。

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2019-08-05
    • 2023-01-12
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多