Django:对象初始化

时间:2014-02-12 20:43:30

标签: python django

我正在学习Python和Django,并试图了解如何初始化对象。假设我有一个名为Alpha的Django模型,它有三个属性:xyzxy是整数,z是布尔值。当我创建Alpha对象时,我想初始化xy(类似于C ++中的构造函数)。然后,如果z等于True,我想自动将x设置为y,否则设置为False。我被建议编辑__init__函数,我尝试了以下内容:

from django.db import models

class Alpha:
    x = models.IntegerField(default = 0)
    y = models.IntegerField(default = 0)
    z = models.BooleanField(default = 'false')

然而,这并不像我预期的那样有效。在Django shell中,我有以下内容:

>>> from test.models import Alpha
>>> a = Alpha(3, 3)
>>> a.x
3
>>> a.y
0
>>> a.z
u'false'

我正在尝试设置x=3y=3,因此z='True',但这显然不是正在发生的事情。 y没有设置任何东西,我怀疑这是因为第一个参数实际设置为self,而不是x。我不认为我完全理解self论证的作用,这可能是问题......

关于我应该如何做到这一点的任何建议?

3 个答案:

答案 0 :(得分:2)

您已被正确告知:覆盖__init__是一种可能性:

from django.db import models

class Alpha(models.Model):  # <-- missing inheritance?
    x = models.IntegerField(default = 0)
    y = models.IntegerField(default = 0)
    z = models.BooleanField(default = False)  # <-- False, not 'false'

    def __init__(self, *args, **kwargs):
        super(Alpha, self).__init__(*args, **kwargs)
        self.z = (self.x == self.y)

答案 1 :(得分:1)

我更喜欢使用信号而不是覆盖原生方法。尝试使用post_init或pre_save信号为您设置值。 post_init仅在初始化对象时执行,并且不会在后续模型编辑时执行。 pre_save将在保存对象时执行。

https://docs.djangoproject.com/en/dev/ref/signals/#post-init

from django.db.models.signals import post_init
from django.dispatch import receiver
from myapp.models import Alpha

@receiver(post_init, sender=Alpha)
def my_handler(sender, instance):
    instance.z = (instance.x == instance.y):

https://docs.djangoproject.com/en/dev/ref/signals/#pre-save

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Alpha

@receiver(pre_save, sender=Alpha)
def my_handler(sender, instance, raw, using, update_fields):
    instance.z = (instance.x == instance.y)

编辑:使用奇怪的一行布尔赋值

答案 2 :(得分:0)

如果您正在使用位置参数创建django模型类的实例,则第一个参数用于id,如果您不想手动设置,则应为None

>>> a = Alpha(None, 3, 3)
>>> a
<Alpha: Alpha object>
>>> a.x
3
>>> a.y
3
>>> a.z
u'false'

设置z=True的最简单方法是x==z只是将此比较作为第{类{1}}中的第三个(无计数无)参数传递:

__init__

当然,如果你可以覆盖>>> x = y = 3 >>> a = Alpha(None, x, y, x==y) 方法(请查看@freakish回答)。