Джанго модель ссылки и манипуляции - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующие модели в 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.Теперь я хочу отобразить количество каждого аккаунта, присутствующего в поле «msofficeaccount» (присутствует в моделях устройств) на моей странице администратора модели Office_Accounts.Например, если xyz@abc.com отображается в 10 строках поля msofficeaccount, то счетчик должен отображаться как 10 на странице администратора Office_Accounts.Кто-нибудь может подсказать, как мне подойти к этой проблеме, чтобы решить ее?

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете добавить метод к вашему классу администратора, который возвращает количество связанных устройств для каждого 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.)

...