有没有一种有效的方法可以在list_display中使用相关模型的字段?

时间:2019-04-01 18:27:17

标签: django python-3.x django-models django-admin

我有两个模型 user (内置django)模型和另一个名为 usertypes 的模型,其中有 user 作为外键它使 usertypes 模型与 user 模型保持一致。在 usertypes 模型中,有一个名为staff_status的字段,我想在list_display中使用此(staff_status)字段。我已经找到了使用callable可以解决此问题的解决方案,但我还阅读到使用callable func会减慢该过程,因为它多次访问数据库,然后我阅读到使用get_queryset可以解决此问题,但是我不知道如何使用query_set可以解决此问题,或者还有另一种更有效的方法来解决此问题。

class UserTypesInline(admin.TabularInline):
    model = UserTypes
    raw_id_fields = ['user']

class UserAdmin(BaseUserAdmin):
    inlines = [UserTypesInline]
    list_display = ('username','staff',)

    def staff(self, instance):
      return instance.usertypes.staff_status

    # def get_queryset(self,request):
    #     qs = super(UserAdmin, self).get_queryset(request)
    #     a = qs.select_related('usertypes')
    #     return a



admin.site.unregister(User)
admin.site.register(User, UserAdmin)
class UserTypes(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    staff_choices = (
        ('', ''),
        ('Admin', 'Admin'),
        ('Chef', 'Chef'),
        ('Delivery Boy', 'Delivery Boy'),
    )
    staff_status = models.CharField(max_length=15, choices=staff_choices, default=staff_choices[0][0]) 

    def __str__(self):
        return self.staff_status

1 个答案:

答案 0 :(得分:1)

您需要设置list_select_related属性,以告知Django选择相关项以及原始列表查询集。

class UserAdmin(BaseUserAdmin):
    inlines = [UserTypesInline]
    list_display = ('username','staff',)
    list_select_related = ('usertypes',)

    def staff(self, instance):
      return instance.usertypes.staff_status

(不过,我认为您注释掉的代码会奏效-尝试时会发生什么?)