从django中的另一个类中获取值

时间:2018-06-11 16:14:55

标签: django django-models

作为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,它就可以工作。

5 个答案:

答案 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