已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.
7天前关闭。
Improve this question
假设我有一个Django模型Model1
和一个python类Class1
。Class1
有一些属性是从Model1
中的值派生的。实现这一点的最佳方法是什么?在Class1
__init__
方法中访问Mode1
。或者在Class1
属性中访问Model1
?不确定如何定义“最佳方式”-更Python,更高效等等?
一个非常人为的例子,我问:
class Model1(models.Model):
model_id = models.AutoField(primary_key=True)
field1 = models.CharField()
field2 = models.CharField()
class Class1:
def __init__(self, value1, value2):
self.value1 = value1
self.value2 = value2
self._model1 = Model.objects.get(model_id=self.value1)
@property
def value3(self):
return self._model1.field1 * 10
@property
def value4(self):
field2 = Model.objects.get(model_id=self.value2).field2
return field2 * 22
哪种范式“更好”-value4
的属性还是value3
的属性?
我猜value4
的属性更有效,因为Model1
查询集不会像包含在Class1
__init__
中那样在内存中挂起。
谢谢你!
1条答案
按热度按时间kmpatx3s1#
为什么
Class1
是必需的,这一点并不明显。出于许多(不是所有)目的,我们会在Model1
类上定义方法/属性。(参见Django代理模型)否则,如果将始终使用此示例,并且此示例应与
Class1
示例保持相同的时间,则__init__
获取_model1
。如果不会始终使用Class1
属性,或者每次调用属性值时都需要来自DB的最新值,则根据需要在该属性中从DB获取。也可以将
_model
设置为查询DB以获取和缓存self._model_instance
的属性。这样,您就可以获得上述两种方法的最佳效果(但如果get
失败,调试可能会更困难)。避免不必要的DB访问通常比Python编码的任何细节都要重要得多。
如果你不创建整个模型示例,而是只从数据库中检索你感兴趣的字段,效率会有所提高。参见Django queryset
.values()
和.values_list()
。你同样可以缓存这样的查询结果。