django - 从 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 就可以了。
解决方案
您不需要TjgFaktor
通过显式查询来获取。如果您查询some_moment.typ
,Django 本身将执行一个隐式查询来获取与TjgFaktor
(Moment
通过外键)对应的 ,或者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))
推荐阅读
- prolog - 如何用从 1 到 N 的 N 个元素填充列表,接受 Prolog 中的重复?
- python - 取数组中每 3 个点的平均值并将新值保存到新数组中
- regex - 使用 REGEX 在 notepad++ 中以 " 开头和结尾的多行换行,并在它们之间换行
- jquery - 修复 div 滚动到
- typescript - 使用 jasmine-ajax 模拟 XMLHttpRequest 给出 jasmine.ajax = undefined
- javascript - 为什么我的逻辑是错误的?复选框和直通
- c - 卡住拆卸
- javascript - 选中复选框后如何使复选框为真/假
- angular - 如何使用 `providedIn` 将服务限制为一个组件
- azure - 使用 Azure Web Jobs 调用 Rest API