Python 如何在Django中处理模型中的动态计算属性?

Python 如何在Django中处理模型中的动态计算属性?,python,django,oop,django-models,django-signals,Python,Django,Oop,Django Models,Django Signals,在Django中,我计算地理对象的面包屑(父亲列表)。因为它不会经常更改,所以我考虑在保存或初始化对象后对其进行预计算 1)什么更好?哪种解决方案的性能更好?要在__________;时计算它,还是在保存对象时计算它(对象在数据库中大约需要500-2000个字符) 2.)我试图覆盖___init____;或save()方法,但我不知道如何使用刚刚保存的对象的属性。访问*args、**kwargs不起作用。我如何访问它们?我必须保存、访问父亲然后再次保存吗 如果我决定保存面包屑。最好的方法是什么?

在Django中,我计算地理对象的面包屑(父亲列表)。因为它不会经常更改,所以我考虑在保存或初始化对象后对其进行预计算

1)什么更好?哪种解决方案的性能更好?要在__________;时计算它,还是在保存对象时计算它(对象在数据库中大约需要500-2000个字符)

2.)我试图覆盖___init____;或save()方法,但我不知道如何使用刚刚保存的对象的属性。访问*args、**kwargs不起作用。我如何访问它们?我必须保存、访问父亲然后再次保存吗

如果我决定保存面包屑。最好的方法是什么?我使用并拥有crump=PickledObjectField()

模型:

class GeoObject(models.Model):
    name = models.CharField('Name',max_length=30)
    father = models.ForeignKey('self', related_name = 'geo_objects')
    crumb = PickledObjectField()
    # more attributes...
这是计算属性crumb()的方法

这是我的保存方法:

def save(self,*args, **kwargs):
    # how can I access the father ob the object?
    father = self.father # does obviously not work
    father = kwargs['father'] # does not work either 

    # the breadcrumb gets calculated here
    self.crumb = self._breadcrumb(father)
    super(GeoObject, self).save(*args,**kwargs)

请帮帮我。我已经为此工作了好几天了。谢谢。

在while循环开始时,通过使用x.father调用_breadcrumb方法并指定x=x.father,您跳过了一个父亲。试着交换

self.crumb = self._breadcrumb(father) 

通过在模型类中定义_breadcrumb,您可以像这样清理它:

class GeoObject(models.Model):
    name = models.CharField('Name',max_length=30)
    father = models.ForeignKey('self', related_name = 'geo_objects')
    crumb = PickledObjectField()
    # more attributes...

    def _breadcrumb(self):
        ...
        return breadcrumb

    def save(self,*args, **kwargs):
        self.crumb = self._breadcrumb()
        super(GeoObject, self).save(*args,**kwargs)

对于更复杂的层次结构,我建议

但什么是父亲?你说访问self.father显然不起作用,但为什么不呢?到底是什么?父亲是模型中的一个属性。我现在添加了模型的示例代码。显然,我的意思是,我不能访问对象,因为它还没有被保存。这根本不符合我的意思。如果你有一个父亲(这里通常的英文单词是parent,但这并不重要),无论你是否储蓄,都可以访问。如果没有,代码中就没有设置一个,所以保存后仍然没有。
self.crumb = self._breadcrumb(self)
class GeoObject(models.Model):
    name = models.CharField('Name',max_length=30)
    father = models.ForeignKey('self', related_name = 'geo_objects')
    crumb = PickledObjectField()
    # more attributes...

    def _breadcrumb(self):
        ...
        return breadcrumb

    def save(self,*args, **kwargs):
        self.crumb = self._breadcrumb()
        super(GeoObject, self).save(*args,**kwargs)