如何解决Django-使用多对多映射表查询2个表
如果我有两个表people
和fruits
,而第三个表则映射了两者之间的多对多关系。
人员表
id person
1 bob
2 alice
水果桌
id fruit
1 apple
2 pear
3 orange
4 grapes
PEOPLE_FRUITS_MAP
id person_id fruit_id
1 1 1
2 1 3
3 1 4
4 2 1
例如,如何获取一个包含所有与bob相关的水果名称的 Django QuerySet。
我想在SQL中会是这样:
SELECT
fruits.id AS fid,fruits.name AS fn,FROM
people
LEFT JOIN
people_fruits_map
ON people.id = people_fruits_map.person_id
LEFT JOIN
fruits
ON fruits.id = people_fruits_map.fruit_id
WHERE
person.id = 1;
查询结果
fid fn
--------------
1 apple
3 orange
4 grapes
DJANGO模型
class Fruits(models.Model):
fruit = models.TextField(unique=True,blank=True,null=True)
class Meta:
managed = False
db_table = 'fruits'
class People(models.Model):
person = models.TextField(unique=True,null=True)
class Meta:
managed = False
db_table = 'people'
class PeopleFruitsMap(models.Model):
fruit = models.ForeignKey(Fruits,models.DO_NOTHING,null=True)
people = models.ForeignKey(People,null=True)
class Meta:
managed = False
db_table = 'people_fruits_map'
解决方法
要从给定模型中查询多对多关系,可以在Django中编写ORM查询。
首先,您可以在模型中添加反向关系名称,以使其更具可读性。这不是必需的步骤,因为Django会自己添加默认名称。
在您的PeopleFruitsMap
模型中,添加related_name
class PeopleFruitsMap(models.Model):
fruit = models.ForeignKey(Fruits,models.DO_NOTHING,blank=True,null=True,related_name='fruit_to_people_mapping')
people = models.ForeignKey(People,null=True)
class Meta:
managed = False
db_table = 'people_fruits_map'
现在尝试在Django Shell中运行此查询。运行python manage.py shell
,然后运行此查询,其中1是您所需的ID:
from your_app.models import Fruit
fruits = Fruit.objects.filter(fruit_to_people_mapping__people__id=1)
如果需要,可以动态传递 Id。
要匹配查询,您始终可以使用print(fruits.query)
来检查等效的postgres查询。
相关名称可帮助您引用模型对象中的反向关系,在这种情况下,它将检查PeopleFruitsMap
模型映射,在该映射中,我们可以查询人员关系以匹配ID。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。