Django ORM - 我可以使用 ID 以外的其他列创建一个带有外键的新对象吗?

Django ORM - Can I create a new object with a foreign key using a different column other than ID?

我查了很多,找不到任何我要找的例子,所以我不确定是否可行。

我有一个带有外键的模型。我想在该模型中创建一个新对象,但我没有 ID,但我有字段“用户名”值。我还应该补充一点,这是与另一个外键的外键关系

工作日分配模型示例:

class WeekdayAssignment(models.Model):
    start_date = models.DateField(auto_now=False, auto_now_add=False)
    end_date = models.DateField(auto_now=False, auto_now_add=False)
    triage = models.ForeignKey(TeamMember, on_delete=models.PROTECT, related_name="triagers")
    ...

团队成员模型示例:

class TeamMember(models.Model):
    member = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='Member Name')
    ...

用户模型示例:

class User(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    username = models.CharField(max_length=50)

我想做的是使用来自外键的成员用户名创建一个新对象,而不是像这样的 ID:

WeekdayAssignment.objects.create(start_date='2021-01-13', end_date='2021-01-20', triage__member__username='jac')

但是,如果我这样做,我会得到错误 WeekdayAssignment() 得到一个意外的关键字参数 'triage__member__username' 如果我删除 __username

如果像这样从字段中删除 __member__username

WeekdayAssignment.objects.create(start_date='2021-01-13', end_date='2021-01-20', triage='jac')

我得到 ValueError: Cannot assign "'jac'": "WeekdayAssignment.triage" must be a "TeamMember" instance. 这完全符合预期不是 ID 或实例。

所以我的问题是,我是否可以使用外键模型中的另一个字段来创建数据,或者我是否一直在使用 ID?

如有任何帮助,我们将不胜感激。

谢谢, jAC

不,你不能。在幕后,Django 的 create 查询集方法使用 INSERT SQL 语句在相应的数据库 table 中创建一个新行。 ForeignKey 字段对应于一个整数 DB 列(通常),该列包含对数据库中另一个 table 中的行的引用。因此,对于 Django ORM,您需要提供一个数字 ID 或一个代表您的 ForeignKey 的模型实例。如果您没有 ID 但有另一个字段值,那么首先您需要通过该字段进行另一个查询以查找具有该值的模型实例(数据库行)并使用该模型实例(或其行 ID)在你的 create 通话中。

您需要提供 TeamMember 的实例。因此,假设用户名 'Jac' 的用户登录:

下面的方法是错误的:

wdass = WeekdayAssignment.objects.create(start_date='2021-01-13', end_date='2021-01-20', triage='Jac')

下面的方法是对的:

t_member = TeamMember.objects.filter(member=request.user).first()
wdass = WeekdayAssignment.objects.create(start_date='2021-01-13', end_date='2021-01-20', triage=t_member.id)