在Django中基于外键进行过滤

时间:2020-01-14 18:22:54

标签: django foreign-keys

我正在尝试通过外键基于另一个表中的值过滤一个表。

trench_id = models.ForeignKey(Trench, db_column='trench_id', on_delete = models.PROTECT)

如上所述,上下文模型通过Trench_id__trench_id加入了Trench模型,我要访问trench.name,如下所示,然后在过滤器中使用此值。我包含views.py代码,并作为我的models.py的参考。

def allcontexts(request):
    allcontexts = Context.objects.filter(trench_id__trench_id__name=request.session.get("name"))
    return render(request, 'context_manager/context_manager.html',
    {
    'allcontexts':allcontexts,
    })

我遇到以下错误Unsupported lookup 'name' for AutoField or join on the field not permitted.

models.py

class Trench(models.Model):
    trench_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    area_easting = models.IntegerField()
    area_northing = models.IntegerField()

    def __str__(self):
        return str(self.name)

class Context(models.Model):
    context_id = models.AutoField(primary_key=True)
    trench_id = models.ForeignKey(Trench, db_column='trench_id', on_delete = models.PROTECT)
    number = models.IntegerField()
    type = models.CharField(max_length = 50, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    excavation_method = models.CharField(max_length = 50, blank=True, null=True)
    open_date = models.DateField(blank=True, null=True)
    close_date = models.DateField(blank=True, null=True)
    excavated_by = models.CharField(max_length = 50, blank=True, null=True)
    area_easting = models.IntegerField()

    def __str__(self):
        return str(self.number)

额外的疑难解答

这是正在生成的sql,它不在沟槽表中查找。

queryset = Context.objects.filter(trench_id__trench_id=4)

print(queryset.query)

SELECT "kap"."context"."context_id", "kap"."context"."trench_id", "kap"."context"."number", "kap"."context"."type", "kap"."context"."description", "kap"."context"."excavation_method", "kap"."context"."open_date", "kap"."context"."close_date", "kap"."context"."excavated_by", "kap"."context"."area_easting" 
FROM "kap"."context" 
WHERE "kap"."context"."trench_id" = 4 ORDER BY "kap"."context"."number" ASC

1 个答案:

答案 0 :(得分:1)

在我看来,它应该只是Context.objects.filter(trench_id__name=request.session.get("name"))。如所写,您正在要求name模型上的trench_id自动字段的Trench属性-当然不存在。

相关问题