【问题标题】:Django admin add extra fields in listDjango 管理员在列表中添加额外的字段
【发布时间】:2023-11-22 06:43:01
【问题描述】:

在我的项目中,我有一个表,其中包含另一个表的外键。 在 django admin 中,我会显示两个表中的字段。 这是我的原始模型:

class t_time(models.Model):
    history_main = models.IntegerField(default=0)
    elapsed_t = models.DecimalField(max_digits=20, decimal_places=6, default=Decimal('0.0000'))

在 admin.py 中,我尝试对提取进行查询并将表中的额外字段添加到我的视图中,但可能在某些方面我错了。我尝试像这样覆盖 get_queryset:

class t_timeAdmin(admin.ModelAdmin):
    list_display = ('id','hist_data','elapsed_t')

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        myqs = t_history.objects.get(id=t_time.history_main)
        queryset = queryset.annotate(
            _hist_data=myqs.test_type,
            #_villain_count=Count("villain", distinct=True),
        )
        return queryset

    def hist_data(self, obj):
        return obj._hist_data

但我收到一个关于返回类型 (int) 的错误,该类型可能与 annotate() 指令有关。 如何将查询中的额外字段添加到我的 django 管理视图?

提前非常感谢

【问题讨论】:

  • 我怀疑问题出在t_history.objects.get(id=t_time.history_main)。 Django 期望 id 为 int,但 t_time.history_main 是一个字段。

标签: django django-admin django-queryset


【解决方案1】:

这是您可以使用 OneToOneFields 解决问题的一种方法。

models.py

class DataModel(models.Model):
    name = models.TextField(max_length=100)

    def __str__(self):
        return '%s' % self.name

    def two_fields(self):
        id = self.id
        field1 = ModelData.objects.get(connected_table_id=id).data1
        field2 = ModelData.objects.get(connected_table_id=id).data2
        return '%s %s' % (field1, field2)


class ModelData(models.Model):
    data1 = models.IntegerField()
    data2 = models.IntegerField()
    connected_table = models.OneToOneField(DataModel,
                                           related_name="DataModel",
                                           on_delete=models.CASCADE,
                                           )

    def extramethod(self):
        code = self.connected_table_id
        format_code = DataModel.objects.get(id=code).name
        return format_code

admin.py

@admin.register(ModelData)
class ModelDataAdmin(admin.ModelAdmin):
    list_display = ('id', 'data1', 'data2', 'connected_table', 'extramethod',)

@admin.register(DataModel)
class ModelDataAdmin(admin.ModelAdmin):
    list_display = ('name', 'two_fields',)

【讨论】:

    最近更新 更多