如何在Django中加入非主键和外键列的查询

Posted

技术标签:

【中文标题】如何在Django中加入非主键和外键列的查询【英文标题】:how to join a query on non primary key and foreign key column in Django 【发布时间】:2020-05-30 07:04:06 【问题描述】:

我有两个模型,将唯一键列作为其他表的外键。

class Employee(models.Model):
    EmployeeId = models.IntegerField(unique=True)
    Employee_Name = models.CharField(max_length=100)

class Release(models.Model):
    EmployeeId = models.ForeignKey(Employee, on_delete=models.CASCADE, to_field="EmployeeId") 

当我尝试连接查询时,它正在对 Employee 表的主键列进行连接。

下面是我期待加入Employee.EmployeeId =Release.EmployeeId的连接查询

r=Release.objects.all().select_related('EmployeeId')

但上面的查询给出了

print(str(r.query))

输出:

'SELECT "app_release"."id", "app_release"."EmployeeId_id", "app_employee"."id", "app_employee"."EmployeeId", "app_employee"."Employee_Name" 
FROM "app_release" INNER JOIN "app_employee" 
ON ("app_re
lease"."EmployeeId_id" = "app_employee"."id")' 

我不想要的,而不是

ON ("app_release"."EmployeeId_id" = "app_employee"."id")'

我想要

ON ("app_release"."EmployeeId_id" = "app_employee"."EmployeeId")'

【问题讨论】:

你运行makemirationsmigrate了吗? 是的,我做到了。 form.save 正在使用外键 empoyee.EmpoyeeId.. 我在 Employee 表中有一个数据:id=1,employeeid=123,Name='xyz'。以发布形式。我给employeeid = 123,并保存表格。它工作正常。 ***.com/a/43131616/5921826 【参考方案1】:

因此您需要将 Employee.EmployeeId 声明为主键并删除唯一键,因为主键本身是唯一的。 试试这个代码..在员工模型中

EmployeeId = models.IntegerField(primary_key=True)

如果你不想修改表格,那么你可以使用原始查询,请参考下面的链接

raw query in Django

请告诉我它是否有效

【讨论】:

不修改表的任何其他选项。

以上是关于如何在Django中加入非主键和外键列的查询的主要内容,如果未能解决你的问题,请参考以下文章

问题 Datagridview 和外键和主键列

如何匹配主键和外键的值?

SQL 外键名称问题

如何分清SQL数据库中的主键与外键

PostgreSQL - 如何从“选择不同”查询创建“维度”表并创建主键和外键?

在MySQL中如何设置主键和外键