如何在Django Admin中预取modelnline的ForeignKey?

2024-09-27 04:07:16 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有以下模型:

class Person(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

class SNS(models.Model):
    name = models.CharField(max_length=255)

    # for display in raw_id_fields
    def __str__(self):
        return self.name

class PersonSNS(models.Model):
    person = models.ForeignKey('Person', related_name='sns')
    sns = models.ForeignKey('SNS')
    url = models.CharField(max_length=255)

admin.py

class PersonSNSInline(admin.StackedInline):
    model = PersonSNS
    fields = ('sns', 'url')
    raw_id_fields = ('sns',)

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    inlines = [PersonSNSInline]

    def get_queryset(self, request):
        return super(PersonAdmin, self).get_queryset(request).prefetch_related('sns')

但是,django-debug-toolbar显示执行的SQL,如:

SELECT `sns`.`id`, `sns`.`name` FROM `sns` WHERE `sns`.`id` IN (1, 2, 3, 5, 6)

以及

SELECT `sns`.`id`, `sns`.`name` FROM `sns` WHERE `sns`.`id` = 1
Duplicated 5 times.
SELECT `sns`.`id`, `sns`.`name` FROM `sns` WHERE `sns`.`id` = 5
Duplicated 5 times.
SELECT `sns`.`id`, `sns`.`name` FROM `sns` WHERE `sns`.`id` = 6
Duplicated 5 times. 
SELECT `sns`.`id`, `sns`.`name` FROM `sns` WHERE `sns`.`id` = 3
Duplicated 5 times. 
SELECT `sns`.`id`, `sns`.`name` FROM `sns` WHERE `sns`.`id` = 2
Duplicated 5 times.

我想知道为什么PersonSNSInline虽然我已经预取了相关的数据,但是仍然一个接一个地查询数据库。你知道吗


Tags: namefromselfidadminmodelswhereselect

热门问题