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

Python Django ORM-我可以使用ID以外的其他列创建带有外键的新对象吗?,python,django,django-models,orm,Python,Django,Django Models,Orm,我四处查看了一下,没有找到任何我正在寻找的例子,所以我不确定这是否可能 我有一个带外键的模型。我想在该模型中创建一个新对象,但我没有ID,但有字段“username”值。我还要补充一点,这是一个外键与另一个外键的关系 WeekdayAssignment模型示例: class WeekdayAssignment(models.Model): start_date = models.DateField(auto_now=False, auto_now_add=False) end_d

我四处查看了一下,没有找到任何我正在寻找的例子,所以我不确定这是否可能

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

WeekdayAssignment模型示例:

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)
用户模型示例:

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.objects.create(start_date='2021-01-13', end_date='2021-01-20', triage='jac')
但是,如果我这样做,我会得到一个错误WeekdayAssignment()得到一个意外的关键字参数'triage\uuuuu member\uuuuuu username',如果我删除\uuuu username

如果从如下字段中删除\uuuuu成员\uuuuu用户名

WeekdayAssignment.objects.create(start_date='2021-01-13', end_date='2021-01-20', triage__member__username='jac')
WeekdayAssignment.objects.create(start_date='2021-01-13', end_date='2021-01-20', triage='jac')
i get ValueError:无法分配“'jac'”:“WeekdayAssignment.triage”必须是“TeamMember”实例。这完全是意料之中的,因为它不是ID或实例

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

任何帮助都将不胜感激

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

您需要给出
团队成员的实例。因此,假设一个用户名为“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)

可以直接在该字段中添加任何
TeamMember
实例,但它必须是
TeamMember
实例。Ahh完全有意义。非常感谢你!对于其他正在寻找解决方法的人来说,我最终做了一个get-on用户,然后使用该结果对该成员进行了get-on。这实际上比我在下面的评论中所做的更好。我做了一个轻微的编辑,并将其t-member更改为TeamMember.objects.get(member=request.user)。但这就是我要找的!谢谢