作为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,它就可以工作。
答案 0 :(得分:1)
假设import pymongo
conn = pymongo.MonogClient('localhost','27017')
db = conn['db']
coll = db['coll']
person = {'name': 702104534, 'type'='Single' }
coll.insert_one(person)
是factor
类中的函数,如果Moment
对象具有相关Moment
对象,则可以访问因子:
TjgFaktor
答案 1 :(得分:1)
您无需通过显式查询获取TjgFaktor
。如果您查询some_moment.typ
,Django本身将执行implcit查询以获取与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))
答案 2 :(得分:0)
因此,在因子方法中,您需要输入typ的值作为字符串值,如下所示:self不满足所需的字符串参数的条件。你可以这样做 -
def factor(self):
return TjgFaktor.objects.get(typ="YOUR_TYPE_IN_STRING").factor
答案 3 :(得分:0)
如下所示更改模型,
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)
@property
def factor(self):
return self.typ.factor
然后,您将获得每个factor
的{{1}} as,
Moment
您可以在此处利用@property
装饰器
答案 4 :(得分:0)
def factor(self):
return TjgFaktor.objects.get(typ=self).factor
您实际上无法将时刻的对象与 TjgFaktor 中的对象进行比较。您可以通过这样的方式直接访问父模型或外键的值。
e.typ.factor #this will directly give you factor values of foreign key.
或者你可以与
进行比较 def factor(self):
return TjgFaktor.objects.get(typ=self.typ.id).factor