在Python类中寻找Django查询的最佳实践[已关闭]

fkaflof6  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(156)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.

7天前关闭。
Improve this question
假设我有一个Django模型Model1和一个python类Class1Class1有一些属性是从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__中那样在内存中挂起。
谢谢你!

kmpatx3s

kmpatx3s1#

为什么Class1是必需的,这一点并不明显。出于许多(不是所有)目的,我们会在Model1类上定义方法/属性。(参见Django代理模型)
否则,如果将始终使用此示例,并且此示例应与Class1示例保持相同的时间,则__init__获取_model1。如果不会始终使用Class1属性,或者每次调用属性值时都需要来自DB的最新值,则根据需要在该属性中从DB获取。
也可以将_model设置为查询DB以获取和缓存self._model_instance的属性。这样,您就可以获得上述两种方法的最佳效果(但如果get失败,调试可能会更困难)。

@property
def _model1( self):
    if not hasattr( self, '_model1_instance'):
        self._model1_instance = Model.objects.get(model_id=self.value1)
    return self._model1_instance

避免不必要的DB访问通常比Python编码的任何细节都要重要得多。
如果你不创建整个模型示例,而是只从数据库中检索你感兴趣的字段,效率会有所提高。参见Django queryset .values().values_list()。你同样可以缓存这样的查询结果。

相关问题