如何在Djang中默认IntegerField

2024-09-26 22:55:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在研究一个Django,遇到了一个小问题。

我正在寻找一种方法,使西装长度等于客户的身高默认值。这类代码对我有效:

    class Customer(models.Model):
        name = models.CharField(max_length=20)
        height = models.IntegerField(default=170)

    class Suit(models.Model)
        customer = models.ForeignKey(Customer)
        suit_design = models.CharField(max_length=100)
        suit_length = models.IntegerField(default=0)
        def get_height(self):
            self.suit_length = self.customer.height
            return

但是每次我创建一个新的套装时,它的默认套装长度=0,我必须运行get_height()来获得我想要的。有没有办法将suit_length_默认为customer.height,并避免每次创建新西装时都运行get_height()?我可能在找这样的短信:

    class Customer(models.Model):
        name = models.CharField(max_length=20)
        height = models.IntegerField(default=170)

    class Suit(models.Model)
        customer = models.ForeignKey(Customer)
        suit_design = models.CharField(max_length=500)
        suit_length = models.IntegerField(default=lambda:self.customer.height)

但这个代码不起作用。


Tags: selfdefaultgetmodelmodelscustomerlengthmax
2条回答

您希望在运行时有一个不变量为真,即西装的初始长度等于顾客的身高。

python的方法不包括init吗?

    class Suit(models.Model)
        customer = models.ForeignKey(Customer)
        suit_design = models.CharField(max_length=500)
        suit_length = models.IntegerField(default=lambda:self.customer.height)

        def __init__(self, args, kwargs):
            super(models.Model, args, kwargs)
            if kwargs['customer']:
                self.customer = kwargs['customer']
                # this creates the invariant
                self.suit_length = self.customer.height  
            else:
                raise ValueError("Must have a customer before constructing a Suit")
            # More code for suit_design, etc.
        }

Django使用save()方法实际保存数据。您可以这样覆盖它:

class Suit(models.Model):
    def save(self):
        if self.suit_length == 0:
            self.suit_length = self.customer.height
        super(Suit, self).save()

它不会覆盖默认值,但它实现了您的目标。

相关问题 更多 >

    热门问题