【问题标题】:Get django default model field value to be a parent attribute value获取 django 默认模型字段值作为父属性值
【发布时间】:2014-11-15 23:35:28
【问题描述】:

我希望默认的 modB localField 值是对应外键的 modA WantedField 值。这将给出:

class modA(models.Model):
    wantedField = models.CharField(max_length=9)
    def asDefault():
        return wantedField


class modB(models.Model): 
    moda        = models.ForeignKey(modA)
    localField  = models.CharField(max_length=9,default=moda.asDefault)

但是 moda 是一个 ForeignKey 对象,因此没有属性“asDefault”。 我想做的事可能吗?

跟随 Kevin Cherepski 更新

这就是我现在的位置:

class modA(models.Model):
    wantedField = models.CharField(max_length=9)
    [ ... other fields ...]
    def asDefault():
        return wantedField

class modB(models.Model): 
    moda        = models.ForeignKey(modA)
    [ ... other fields ...]
    localField  = models.CharField(max_length=9,default=moda.asDefault)
    def save(self, *args, **kwargs):
        if self.pk is None:
            if self.moda and not self.localField:
                self.localField = self.moda.wantedField
        super(modB, self).save(*args, **kwargs)

此外,该方法是否与任何其他字段类型相同? 无论如何,暂时返回:

AttributeError: 'ForeignKey' object has no attribute 'asDefault'

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我认为这可以通过覆盖 modB 的保存方法来完成。

    class modB(models.Model): 
        moda        = models.ForeignKey(modA)
        localField  = models.CharField(max_length=9,default=moda.asDefault)
    
        def save(self, *args, **kwargs):
            if self.pk is None:
                if self.moda and not self.localField:
                    self.localField = self.moda.wantedField
            super(modB, self).save(*args, **kwargs)
    

    【讨论】:

    • 谢谢。我得到:AttributeError: 'ForeignKey' object has no attribute 'asDefault'
    • 我没有测试,但我相信错误来自,'default=moda.asDefault'
    • 我在default=moda.asDefault 周围尝试了很多东西。但这似乎是一条死胡同,因为在这个阶段不可能处理有效的对象,在models.py中知道模型并没有完全启动
    • 我们是否可以从 localField 中删除默认选项并依赖覆盖 save 来执行相同的功能?
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2010-11-21
    • 2017-11-10
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多