0

我在 Django 中有以下模型,其结构如下:

class Office_Accounts(models.Model):
    accountid                       =   models.EmailField(max_length=200, unique=True)
    validtill                       =   models.DateField(default=datetime.now)
    limit                           =   models.CharField(max_length=2)

class Device(models.Model):
    device_type         = models.ForeignKey(DeviceType,to_field='device_type')
    serial_number       = models.CharField(max_length=200,unique=True)
    in_use_by           = models.ForeignKey(User,to_field='username')
    brand               = models.CharField(max_length=200,default="-", null=False)
    model               = models.CharField(max_length=200,default="-", null=False)
    type_number         = models.CharField(max_length=200,blank=True,null=True, default = None)
    mac_address         = models.CharField(max_length=200,blank=True,null=True, default = None)
    invoice             = models.FileField(upload_to='Device_Invoice', null=True, blank = True)
    msofficeaccount     = models.ForeignKey(Office_Accounts, to_field="accountid")

    class Meta:
        verbose_name_plural = "Devices"

    def full_name(self):
        return self.device_type + self.serial_number + self.brand

我将在 admin.py 中显示这两个模型。现在,我想在 Office_Accounts 模型的管理页面中显示字段“msofficeaccount”(存在于设备模型中)中的每个 accountid 的计数。例如,如果 xyz@abc.com 出现在 msofficeaccount 字段的 10 行中,那么在 Office_Accounts 管理页面中计数应显示为 10。谁能指导我如何解决这个问题来解决它?

4

1 回答 1

0

您可以向您的管理类添加一个方法,该方法返回每个 office_account 的相关设备的计数,但这将非常低效。相反,您可以覆盖get_queryset以从数据库聚合函数中注释计数:

from django.db.models import Count

class Office_AccountsAdmin(admin.ModelAdmin):
    list_display = (..., 'device_count')
    ...
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.annotate(device_count=Count('device'))

(顺便说一句,Python 风格总是使用 CamelCase 作为类名,而 Django 风格是使用单数模型名,所以你的模型应该真正称为 OfficeAccount。)

于 2018-10-12T07:41:19.427 回答