Django对Admin

时间:2017-11-28 13:56:01

标签: django

我在多个模型之间有一些复杂的关系。一个简化的例子:

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将成为特定城市的特定旅游。我有一个简单的管理界面,因此TourItemTourItem的内联字段(即可以同时编辑/添加多个旅游项目)。问题是,在查找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') 触发其他查询?

1 个答案:

答案 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')