如何在Django中使用反向外键引用访问数据

时间:2019-05-18 11:44:23

标签: python django

我有一个名为UserProfile的模型和一个PersonalInformation模型。我想在用户登录到网站时使用UserProfile模型获取PersonalInformation的所有数据,但是我在UserProfile模型的PersonalInformation模型中具有外键引用,那么如何使用UserProfile模型获取个人信息?

用户个人资料模型:

class UserProfile(models.Model):
"""Represents a user's model inside our system"""

    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    profile_picture = models.ImageField(upload_to='photos/%y/%m/%d/')
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    highest_degree_earned = models.CharField(max_length=255, blank=False)
    college_name = models.CharField(max_length=255, blank=False)
    graduation_year = models.IntegerField(default=2020, blank=False)

个人信息模型:

class PersonalInformation(models.Model):
    """Represents a user's personal Infromation inside our system"""

    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    mobile = models.CharField(max_length=10 ,blank=True)
    bio = models.TextField(max_length=200, blank=True)
    college_university = models.CharField(max_length=100, blank=False)
    course = models.CharField(max_length=100, blank=False)

1 个答案:

答案 0 :(得分:0)

首先,在代码中,您将显示错误的模型名称。 UserProfile模型名称设置为PersonalInformation,对其进行更改,否则迁移将不起作用(无论您使用的是哪个数据库,数据库都不会接受该模型)。 引用您要问的问题,以获取某个UserProfile实例的PersonalInformation的相关实例,您只需查询下一个:

user = UserProfile.objects.get(id='') #Introduce the id of the user you want to fetch its personal information.
user.personalinformation_set.all() # This will return you a QuerySet with all the related instances of PersonalInformation class.
user.personalinformation_set.get(id='') #To get a specific one or you may use a filter to get a filtered QS.

如果需要,可以为ForeignKey类使用related_name属性,以设置与personalinformation_set不同的名称。 我也建议您阅读Django文档,它的解释非常清楚,我认为: https://docs.djangoproject.com/en/2.2/topics/db/examples/many_to_one/

正如我在评论中看到的那样,如果您只希望每个用户一个PersonalInformation实例,您可能还考虑使用OneToOne关系而不是ForeignKey。该文档位于: https://docs.djangoproject.com/en/2.2/topics/db/examples/one_to_one/