如何在Django中不通过外键对象按db_column字段过滤?

0 投票
2 回答
701 浏览
提问于 2025-04-16 12:30

我有一个老旧的数据库,它的命名方式跟Django不太一样。如果我有以下这些(简化过的)模型:

class Registration(models.Model):
    projectId=models.IntegerField(primary_key=True)

class Application(models.Model):
    applicationId=models.IntegerField(primary_key=True)
    registration=models.ForeignKey(Registration,db_column='projectId')

这里的ForeignKey实例会在Application上创建一个叫registration_id的属性,但这个名字并不是字段的正确名称(我有个小技巧来解决这个问题),而且在QuerySet中也无法使用。

有没有什么办法可以直接在Application模型上使用ForeignKey提供的id字段,而不是通过Registration来引用它呢?


也就是说,我写了很多这样的代码:

Application.objects.get(projectId=1234)


但我不想每次都写成这样:

Application.objects.get(registration__projectId=1234)

甚至是这样:

Application.objects.get(registration__pk=1234)


我有点惊讶的是:

Application.objects.get(registration_id=1234)

这个居然不管用……


另外,我还尝试过把id列定义为一个字段,同时也定义了foreignkey,这样在queryset中是有效的,但在插入数据时却报错,说是试图往同一个列插入两次:

class Application(models.Model):
    ...
    projectId=models.IntegerField()
    ...

2 个回答

0

我觉得直接用 Application.objects.registration.get(projectId=1234) 这个代码就能实现你想要的功能。

0

你试过这个吗?

Application.objects.get(registration=1234)

撰写回答