我正在尝试从其子级访问父级实例。
我有以下型号
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获取信息?
答案 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')
因此,这将导致JOIN
在JOIN
上的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