繁体   English   中英

Django模型参考和操作

[英]Django model reference and manipulation

我在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”字段(存在于设备模型中)中存在的每个帐户标识的计数。 例如,如果xyz@abc.com出现在msofficeaccount字段的10行中,则该计数应在Office_Accounts管理页面中显示为10。 谁能指导我如何解决这个问题?

您可以在您的管理类中添加一个方法,该方法返回每个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。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM