gpt4 book ai didi

python - 在 Django 模型中拥有自定义实例属性的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:54:28 26 4
gpt4 key购买 nike

我想将自定义属性添加到 Django 模型的实例中。这些属性不应存储在数据库中。在任何其他类中,属性将简单地由 __init__ 方法初始化。

我已经可以看到三种不同的方法,但没有一种是完全令人满意的。我想知道是否有更好/更 pythonic/djangoist 的方式来做到这一点?

  1. Override __init__ 方法:语法有点复杂,但它有效。

    from django.db.models import Model

    class Foo(Model):
    def __init__(self, *args, **kwargs):
    super(Model, self).__init__(*args, **kwargs)
    self.bar = 1
  2. 使用 Django post_init 信号:这会将类代码置于类定义之外,可读性差。

    from django.dispatch import receiver
    from django.db.models.signals import post_init
    @receiver(post_init, sender=Foo)
    def user_init(sender, instance, *args, **kwargs):
    instance.bar = 1
  3. 使用实例方法而不是属性:将引发一般异常作为默认行为有点令人不安。

    class Foo(Model):
    def bar(self):
    try:
    return self.bar
    except:
    self.bar = 1
    return self.bar

在这三个选择中,第一个对我来说似乎是最不糟糕的。你怎么看?还有其他选择吗?

最佳答案

我会使用 python 中可用的属性装饰器

class Foo(Model):
@property
def bar(self):
if not hasattr(self, '_bar'):
self._bar = 1

return self._bar

然后您可以像访问属性一样访问它,而不是使用 () 调用函数

通过内置而不是存储回退,您甚至可以更直接地处理此问题

class Foo(Model):
@property
def bar(self):
return getattr(self, '_bar', 1)

关于python - 在 Django 模型中拥有自定义实例属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14463451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com