Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中连接4或5个表_Django_Django Orm_Manytomanyfield_Prefetch - Fatal编程技术网

如何在Django中连接4或5个表

如何在Django中连接4或5个表,django,django-orm,manytomanyfield,prefetch,Django,Django Orm,Manytomanyfield,Prefetch,假设我在Django有几个型号: class-LevelZ(models.Model): title=models.CharField(z('yahoo z name'),最大长度=255) is_display=models.BooleanField(u('is display'),默认值=True) enable=models.BooleanField(uz('is enable'),默认值=True) 类LevelSub(models.Model): levelzs=models.Many

假设我在Django有几个型号:

class-LevelZ(models.Model):
title=models.CharField(z('yahoo z name'),最大长度=255)
is_display=models.BooleanField(u('is display'),默认值=True)
enable=models.BooleanField(uz('is enable'),默认值=True)
类LevelSub(models.Model):
levelzs=models.ManyToManyField(LevelZ,verbose_name=uz('in levelzs'),通过class='levelsubvelz',related_name='inlevelzs'))
title=models.CharField(u('yahoo子名称'),最大长度=255)
is_display=models.BooleanField(u('is display'),默认值=True)
enable=models.BooleanField(uz('is enable'),默认值=True)
类级别SubLevel Z(models.Model):
levelsub=models.ForeignKey(levelsub,related_name='levelsub_inlevelz')
levelz=models.ForeignKey(levelz,related_name='levelz_in_levelsub')
corder=models.PositiveIntegerField(uu('ordering'),默认值=0)#用于排序
类别级别CAT(models.Model):
levelsubs=models.ManyToManyField(LevelSub,verbose_name=u('in levelsubs'),通过class='LevelCatLevelSub',related_name='inlevelsubs')
title=models.CharField(u('yahoo cat name'),最大长度=255)
is_display=models.BooleanField(u('is display'),默认值=True)
enable=models.BooleanField(uz('is enable'),默认值=True)
类LevelCatLevelSub(models.Model):
levelcat=models.ForeignKey(levelcat,相关的\u name='levelcat\u在\u levelsub'中)
levelsub=models.ForeignKey(levelsub,相关的\u name='levelsub\u在\u levelcat'中)
corder=models.PositiveIntegerField(uu('ordering'),默认值=0)#用于排序
类LevelCatItem(models.Model):
levelcats=models.ManyToManyField(LevelCat,详细名称=(在levelcats中),通过class='LevelCatItemLevelCat',相关名称class='inlevelcats')
title=models.CharField(u('yahoo catitem name'),最大长度=255)
is_display=models.BooleanField(u('is display'),默认值=True)
enable=models.BooleanField(uz('is enable'),默认值=True)
类LevelCatItemLevelCat(models.Model):
levelcatitem=models.ForeignKey(levelcatitem,相关的\u name='levelcatitem\u在\u levelcat'中)
levelcat=models.ForeignKey(levelcat,相关的\u name='levelcat\u在\u levelcatitem'中)
corder=models.PositiveIntegerField(uu('ordering'),默认值=0)#用于排序
类别产品(型号.型号):
levelcatitems=models.ManyToManyField(LevelCatItem,详细名称=(在LevelCatItem中),通过='ProductLevelCatItem',相关名称='inlevelcatitems')
title=models.CharField(u('product name'),最大长度=255)
is_display=models.BooleanField(u('is display'),默认值=False)
update_at=models.DateTimeField(u('Updated at'),auto_now=True)
enable=models.BooleanField(uz('is enable'),默认值=True)
类别ProductLevelCatItem(models.Model):
levelcatitem=models.ForeignKey(levelcatitem,相关的\u name='levelcatitem\u在\u product'中)
product=models.ForeignKey(产品,相关的\u name='product\u在\u levelcatitem'中)
corder=models.PositiveIntegerField(uu('ordering'),默认值=0)#用于排序
现在如果我有:

lz=LevelZ.objects.get(pk=18)
然后需要列出属于lz的所有产品,我必须在LevelZ、LevelSub、LevelCat、LevelCatItem表中使用4个manytomany字段

我尝试使用stubid方式:

lz=LevelZ.objects.get(pk=18)
lsubs_list=lz.inlevelzs.filter(enable=True).values_list('id',flat=True)
#lsubs_列表=[175L、171L、177L、179L、181L、178L、176L、180L、182L]
lcats\u list=LevelCat.objects.filter(levelsubs\u in=lsubs\u list,enable=True)。value\u list('id',flat=True)
#LCAT_列表=[2123L、2125L、2145L、2113L、2114L、2115L、2116L、2118L、2119L、2117L、2109L、2110L]
lcatitems\u list=LevelCatItem.objects.filter(levelcats\u in=lcats\u list,enable=True)。value\u list('id',flat=True)
#lcatitems_list=“[[13013L、14475L、14474L、14480L、14481L、14482L、14483L、14484L、14485L、14486L]”
products=Product.objects.filter(levelcatitems\uuuu in=lcatitems\u列表,enable=True,is\u display=True)
而且那表现很差

我知道
。prefetch_related()
适合联接2个表,但我不知道如何联接5个表


我该怎么做?请帮帮我!!谢谢!!

这似乎是一个过于复杂的数据库结构

但是,无论需要连接多少个表,都可以使用双下划线语法跨连接进行查询

products = Product.objects.filter(levelcatitems__levelcats__levelsubs__levelzs__pk=18)

写/画一个你想要得到的结果。谢谢你的回复!这是可行的,但是当数据很大时,性能会下降,导致加入太多的表?无论如何,非常感谢!