<p>我不知道您的要求,但是如果这个操作在保存时占用的时间不可接受,但在访问时占用的时间可接受,我会考虑将<code>FileSize</code>、<code>Duration</code>、<code>VideoFrameRate</code>等视为模型的延迟加载属性,假设较长的初始加载时间是较短保存时间的一个不错的权衡。你知道吗</p>
<p>有很多方法可以做到这一点:可以缓存帧速率,例如,在第一次访问时使用<a href="https://docs.djangoproject.com/en/dev/topics/cache/" rel="nofollow">the caching framework</a>。如果希望将其存储在数据库中,可以通过<a href="http://docs.python.org/library/functions.html#property" rel="nofollow">property</a>访问帧速率,并在第一次访问时计算它(以及其他值,如果合适),然后将它们存储在数据库中。理论上,这些是文件本身的属性,因此您的接口不应允许更改它们,从而使它们与所引用的文件不同步。按照这些思路,我可能会这样做:</p>
<pre><code>class MyMediaFile(models.Model):
file = models.FileField()
_file_size = models.IntegerField(null=True, editable=False)
_duration = models.IntegerField(null=True, editable=False)
<... etc ...>
@property
def file_size(self):
if self._file_size:
return self._file_size
else:
self.populate_file_info(self)
return self._file_size
def populate_file_info(self):
< ... do your thing here ... >
self._file_size = my_calcuated_file_size
< ... etc ... >
</code></pre>
<p>每个<code>property</code>的逻辑可以很容易地分解为一个一般的延迟加载<code>@property</code>,因此不需要为每个样本重复样板文件。你知道吗</p>