从queryset Django中访问多对多字段



我有两个模型:

class Vineyard(models.Model):
name = models.CharField(max_length=255, blank=True)
def __str__(self):
return self.name

class WineRegion(models.Model):
name = models.CharField(max_length=255)
vineyards = models.ManyToManyField(Vineyard, blank=True)
def __str__(self):
return self.name

我想进入葡萄酒产区的所有葡萄园。以下是我尝试过的:

if len(id_list) > 0:
wr = WineRegion.objects.filter(id__in=id_list)
vineyardList = wr.vineyards.all()

但是它给了我一个错误——>AttributeError: 'QuerySet'对象没有属性'vineyards'

我该如何解决这个问题?

编辑:

如果我有另一个叫做Country的模型呢?模型如下:

class Country(models.Model):
name = models.CharField(max_length=255)
wine_rg = models.ManyToManyField(WineRegion, blank=True)
def __str__(self):
return self.name

我想访问葡萄酒产区的所有葡萄园,但现在我有一个Country id列表。我怎么解决这个问题?

我可以这样做:

wine_region_id = Country.objects.filter(id__in=country).distinct().values('wine_rg')
vineyardList = vineyardList.filter(wineregion__in=wine_region_id)

但是我很好奇有没有更好的方法来做这样的事情?

由于wrWineRegions的列表,您需要首先遍历它们:

vineyardList = []
for wr in WineRegion.objects.filter(id__in=id_list):
for vineyard in wr.vineyards.all():
vineyardList.append(vineyard)

但是这将多次访问您的db,以获得每个葡萄园对象。相反,您可以访问Vineyard中的相关名称wineregion,以便在一个查询中获得所有葡萄园对象,如下所示:

vineyardList = Vineyard.objects.filter(wineregion__in=WineRegion.objects.filter(id__in=id_list))

或简单的:

vineyardList = Vineyard.objects.filter(wineregion__in=id_list)

相关内容

  • 没有找到相关文章

最新更新