在django中为对象创建不可编辑的属性

时间:2017-04-10 09:33:57

标签: python django

我目前正在尝试在django 1.10中开发一款应用。我想知道如何在创建时初始化一对多关系中对象的属性。

让我们调用两个相关对象'Set'(一)和'Element'(很多)。

对象'Set'的属性'name'取决于日期和已创建的同类其他对象的数量。在这种情况下,我将值初始化为我感兴趣的值没有问题。

然而,对象'Element'的属性'name'取决于创建的其他Elements的数量,还取决于它所链接的'Set'的'name'。我如何获得这些信息?

我尝试使用变量ForeignKey值创建一个方法,但我只是获得了一个错误。我试过像:

// in models.py
def get_element_name(set_id):
    set = Set.objects.get(pk=set_id)
    set_name = set.name

    return set_name +'other stuff'

class Set(models.Model):
   // set attributes

class Element(models.Model):
   set = models.ForeignKey(Set, on_delete=models.CASCADE)
   name = models.CharField(max_length=250, editable=False, default=get_element_name(set.pk))

我可以看到这是错误的(ForeignKey没有pk属性),但我找不到任何其他问题的解决方案。

(我想在实践中获得:Set的名称由一个字母组成,对应于创建年份,以及每次创建新对象时增加的数字.A001是第一组在2017年创建,A002是第二个,而B001是2018年的第一个等等......元素的代码应该是集合的名称加上一个字母,根据该集合中创建的其他元素的数量。例如A001A是A001的集合中的第一个元素,第二个是A001B等......)

1 个答案:

答案 0 :(得分:0)

在您的情况下,我认为您无法直接在字段定义中设置默认值。相反,您可以在save模型的Element方法中设置此默认值:

def save(self, *args, **kwargs):
    self.name = self.set.name + 'other stuff'
    # or self.name = get_element_name(self.set.id) if you prefer, but it does an unusefull call to db
    return super(Element, self).save(*args, **kwargs)