我有两个模型:
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)
但是我很好奇有没有更好的方法来做这样的事情?
由于wr
是WineRegions
的列表,您需要首先遍历它们:
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)