如何从我的fk字段之一访问父模型?

时间:2019-07-05 19:15:11

标签: django

我正在尝试从其子级访问父级实例。

我有以下型号

class ModelA(models.Model):
   user_name = models.Charfield()
   points = models.Charfield()

class ModelB(models.Model):
   user = models.ForeignKey(ModelA)
   points = models.Charfield()

class ModelC(models.Model):
   model_b = models.OneToOne(ModelB)
   info = models.TextField()

我正在做这样的查询:

ModelB.objects.filter({somefilters}).values('user__user_name')

但是我想检查C中是否有对B的引用,以及是否有获取信息。我不能从ModelC开始:

ModelC.objects.filter({somefilers}).values('model_b__user__user_name')

因为可能没有关于这两种模型的记录。

是否可以从ModelB开始从其父ModelC获取信息?

2 个答案:

答案 0 :(得分:1)

是的,您可以在此处使用__isnull lookup [Django-doc]

ModelB.objects.filter(
    modelc__isnull=False
).values('user__user_name')

因此,我们在这里检查是否有一个指向该ModelC对象的ModelB

例如,您还可以访问相关的modelc对象,例如:

ModelB.objects.filter(
    modelc__isnull=False
).values('user__user_name', 'modelc__info')

因此,这将导致JOINJOIN上的ModelC.model_b ModelB.pk字段中。

如果您使用:

ModelB.objects.values('user__user_name', 'modelc__info')

如果没有这样的相关None存在,它将为modelc__info返回ModelC

答案 1 :(得分:1)

您可以在Model C上使用相关名称,例如:

class ModelC(models.Model):
   model_b = models.OneToOne(ModelB, related_name='modelc')
   info = models.TextField()

在您的查询集中:

ModelB.objects.filter({somefilters}).values('user__user_name', 'modelc__info')

如果您不想设置相关名称,则可以使用:model_b_set__info代替modelc__info