我正在学习Python和Django,并试图了解如何初始化对象。假设我有一个名为Alpha
的Django模型,它有三个属性:x
,y
和z
。 x
和y
是整数,z
是布尔值。当我创建Alpha
对象时,我想初始化x
和y
(类似于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=3
和y=3
,因此z='True'
,但这显然不是正在发生的事情。 y
没有设置任何东西,我怀疑这是因为第一个参数实际设置为self,而不是x
。我不认为我完全理解self
论证的作用,这可能是问题......
关于我应该如何做到这一点的任何建议?
答案 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回答)。