我在多个模型之间有一些复杂的关系。一个简化的例子:
class Country(models.Model):
name = models.CharField([...])
[...]
def __ str__(self):
return f'{self.name}'
class Region(models.Model):
country = models.ForeignKey(Country)
name = models.CharField([...])
[...]
def __ str__(self):
return f'{self.name}'
class CityManager(models.Manager):
def get_queryset(self):
return super().get_queryset().select_related('region', 'region__country')
class City(models.Model):
name = models.CharField([...])
region = models.ForeignKey(Region)
objects = CityManager()
def __str__(self):
return f'{self.region.country} - {self.region} - {self.name}'
因此,当我想显示某种cities
列表(例如列出德国所有城市)时,我必须使用select_related
甚至是远程有效的,否则我会查询{{1}每次调用Country
时。这不是问题。
问题在于,当我拥有不相关的模型组并且我想要FK到__str__
时,例如:
City
class Tour(models.Model):
[...]
class TourItem(models.Model):
tour = models.ForeignKey(Tour)
city = models.ForeignKey(City)
[...]
代表一些音乐乐队的计划巡演;并且Tour
将成为特定城市的特定旅游。我有一个简单的管理界面,因此TourItem
是TourItem
的内联字段(即可以同时编辑/添加多个旅游项目)。问题是,在查找Tour
FK时,现在有多个查询针对同一Country
触发,我不知道如何解决它。我尝试了以下内容,但它没有按预期工作:
City
这两项都不奏效:
class TourManager(models.Manager):
def get_queryset(self):
return super().get_queryset().prefetch_related('touritem_set__city', 'touritem_set__city__region', 'touritem_set__city__region__country')
如何调整管理员/模型,以便在加载Tour的管理员时,不会为class TourItemManager(models.Manager):
def get_queryset(self):
return super().get_queryset().select_related('city', 'city__region', 'city__region__country')
触发其他查询?
答案 0 :(得分:0)
您可以使用ModelAdmin select_related来选择相关表格
list_select_related = ('author', 'category')
如果这不是完全有用的,您仍然想要覆盖tryAdmin
中的以下内容def get_queryset(self, request):
return super(TourItemManager,self).queryset(request).select_related('city', 'city__region', 'city__region__country')