首页 > 解决方案 > 从 django 中的不同类获取值

问题描述

作为 Python 和 Django 的新手,我遇到了一个我认为很简单但又不想消失的问题。我有一个“表格”,其中包含从

class TjgFaktor(models.Model):
    typ = models.CharField(max_length=2)
    factor = models.FloatField()

接下来我有另一个类是外键的:

class Moment(models.Model):
    typ = models.ForeignKey(TjgFaktor,on_delete=models.SET_NULL,null=True)

现在,我想做的是从第一类中获取因子作为 Moment 的属性。我努力了

def factor(self):
    return TjgFaktor.objects.get(typ=self).factor

希望得到正确的因素。但是,当我做类似的事情时

person_moment = Moment.objects.all()    
for e in person_moment:
    print(e.factor())

我得到的是“TjgFaktor 匹配查询不存在”。

那么我该怎么做呢?我想这是函数:如果我用 pk=1 替换 type=self 就可以了。

标签: djangodjango-models

解决方案


您不需要TjgFaktor通过显式查询来获取。如果您查询some_moment.typ,Django 本身将执行一个隐式查询来获取与TjgFaktorMoment通过外键)对应的 ,或者None,如果外键设置为None

因此,我们可以像这样查询:

def factor(self):
    tjgfaktor = self.typ
    if tjgfaktor:
        return tjgfaktor.factor

如果没有相关TjgFaktor的,那么这个函数也会返回None

如果你定义了大量的值,那么这种获取可能效率低下:Django 将从数据库中获取所有列,并且由于我们只对单个列感兴趣,因此这将导致一些开销。

我们可以通过使用以下查询来避免这种情况:

def factor(self):
    if self.typ_id:
        return (TjgFaktor.objects.values_list('factor', flat=True)
                                 .get(pk=self.typ_id))

推荐阅读