Python Django ORM-我可以使用ID以外的其他列创建带有外键的新对象吗?
我四处查看了一下,没有找到任何我正在寻找的例子,所以我不确定这是否可能 我有一个带外键的模型。我想在该模型中创建一个新对象,但我没有ID,但有字段“username”值。我还要补充一点,这是一个外键与另一个外键的关系 WeekdayAssignment模型示例: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
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)。但这就是我要找的!谢谢