获取要用作外键的模型实例,以将数据添加到Django中的其他模型

时间:2019-11-07 08:13:12

标签: python django django-models django-views django-shell

我有一个关系模型,该关系模型映射了两个模型,即我的用户及其position,如上所述。这里Emp_position是那个关系模型。

class Position(models.Model):
    position_name = models.CharField(max_length=20, unique=True)
    def __str__(self):
        return self.position_name


class Emp_position(models.Model):

    emp_uname = models.OneToOneField(User, related_name='emp_name', to_field='username', on_delete=models.CASCADE)
    position_name = models.ForeignKey(Position, related_name='position', to_field='position_name', on_delete=models.CASCADE)

    def __str__(self):
        return str(self.emp_uname) + " " + str(self.position_name)

现在要向Emp_position插入数据,我需要用户和Position的实例。我可以使用user.username字段轻松获得用户模型实例,但是如何获取位置实例。位置实例,我通过使用filter函数使用一些逻辑派生。如何获取实例,该函数可以帮助我使用某种条件获取实例。

这是我尝试过的:

emp_pos = Emp_position(emp_uname = user, position_name = Position.objects.filter(position_name="COMES FROM LOGIC").first())
emp_pos.save()

但这不会保存模型。

编辑:如评论部分所述

emp_pos = Emp_position(emp_uname = user, position_name = Position.objects.filter(position_name=NewProvisionalEmployeeMail.objects.filter(email="bhatnagarpulkitpb@gmail.com").values_list('position_name')).first())
emp_pos.save() 

2 个答案:

答案 0 :(得分:1)

无论您在做什么,即过滤数据库都会给您一个查询集,您需要实例。您有两个过滤器,然后还必须有两个first()才能获取实例。做这个。

emp_pos = Emp_position(emp_uname = user, position_name = Position.objects.filter(position_name=Position.objects.filter(position_name="COMES FROM LOGIC THAT DERIVES THE FIELD NAME").first()[0]).first())
emp_pos.save()

第一个first获得第二个filter的第一个实例,第二个第一个获得第一个filter的实例。

注意:可以通过使用filter然后使用first()函数来获取任何模型的实例。这些对于填充关系表或指定外键非常有帮助,因为它需要我们链接到的另一个模型的实例。如果还有其他方法可以请有人指出。

答案 1 :(得分:0)

在执行 model.objects.filter 时,这将返回与该查询匹配的所有项目,但我发现您的模型 Position 具有1个具有唯一性的字段= True ,这意味着不需要过滤器。而是使用get。

emp_pos = Emp_position(emp_uname =用户, position_name = Position.objects.get(position_name =“ COMES FROM LOGIC”))

emp_pos.save()