如何在Django中设置IntegerField的默认值

13 投票
2 回答
48511 浏览
提问于 2025-04-18 01:34

我在学习Django的时候,遇到了一个小问题。

我想让西装的长度(suit_length)默认等于顾客的身高(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=100)
        suit_length = models.IntegerField(default=0)
        def get_height(self):
            self.suit_length = self.customer.height
            return

但是每次我创建一个新的西装时,它的默认西装长度都是0,这样我就得运行get_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)

但是这段代码并没有成功。

2 个回答

1

你希望在程序运行时有一个不变的条件,那就是一个“Suit”的初始长度要和一个“Customer”的高度相等。

在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.
        }
9

Django使用save()方法来真正保存数据。你可以像下面这样重写这个方法:

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

这并不是在覆盖默认设置,但它能达到你的目的。

撰写回答