📜  django 外键相同 - Python (1)

📅  最后修改于: 2023-12-03 14:40:47.057000             🧑  作者: Mango

Django外键相同

在Django中,外键(ForeignKey)是一种非常强大的功能,它允许在模型之间建立关系。有时候,我们需要在模型中使用相同类型的外键来建立关系。本文将介绍在Django中使用相同类型外键的方法。

定义模型

我们假设有两个模型,PersonAddress,每个人都有一个住址,但一个住址可能有多个人。

class Person(models.Model):
    name = models.CharField(max_length=50)
    address = models.ForeignKey('Address', on_delete=models.CASCADE)

class Address(models.Model):
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    zipcode = models.CharField(max_length=10)

这里Person模型的address字段是一个外键,指向Address模型。现在的问题是,如果我想在Address模型中使用同样类型的外键,该怎么实现呢?

使用related_name

一种实现方式是给Address模型的外键添加一个related_name参数。

class Person(models.Model):
    name = models.CharField(max_length=50)
    address = models.ForeignKey('Address', on_delete=models.CASCADE)

class Address(models.Model):
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    zipcode = models.CharField(max_length=10)
    residents = models.ForeignKey(Person, related_name='residents_of_address', on_delete=models.CASCADE)

Address模型的residents字段中,我们指定了一个related_name参数,命名为residents_of_address。这个参数的作用是指定反向关系的名称,可以使用这个名称在Person模型中访问Address模型。

例如,要获取住在某个地址的所有人,可以通过这样的方式获取:

address = Address.objects.get(id=1)
residents = address.residents.all()

这里,我们首先获取id为1的地址对象,然后通过residents属性访问所有的相关联系人对象。

使用related_query_name

另一种实现方式是使用related_query_name参数。

class Person(models.Model):
    name = models.CharField(max_length=50)
    address = models.ForeignKey('Address', on_delete=models.CASCADE, related_name='residents')
    
class Address(models.Model):
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    zipcode = models.CharField(max_length=10)
    residents = models.ForeignKey(Person, on_delete=models.CASCADE, related_query_name='address')

Address模型中,我们仍然使用一个外键residents来指向Person模型。不同的是,我们使用了related_query_name参数,命名为address。这个参数的作用是指定反向查询的名称,可以使用这个名称在Person模型中进行反向查询。

例如,要获取住在某个地址的所有人,可以这样获取:

residents = Person.objects.filter(address_id=1)

这里,我们使用address_id来过滤所有居住在id为1的地址的人。

conclusion

以上是在Django中使用相同类型外键的实现方式。通过在外键中添加related_namerelated_query_name参数,我们可以方便地在不同的模型之间建立关系。这使得我们能够更轻松地处理复杂的数据结构,在应用程序中实现所需的功能。