Django многие отношения модели сбой администратора на создание объекта - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть объект Event в моей базе данных postgres, и я создал новый объект Collection для группировки событий по теме с помощью отношения поля ManyToMany:

class Collection(models.Model):
    event = models.ManyToManyField('Event', related_name='collections')
    name = models.CharField(blank=True, max_length=280)
    slug = AutoSlugField(populate_from='name')
    image = models.ImageField(upload_to='collection_images/', blank=True)
    description = models.TextField(blank=True, max_length=1000)
    theme = models.ManyToManyField('common.Tag', related_name='themes')
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('collection', args=[self.slug])

    def clean(self):
        # because of the way db saves M2M relations, collection doesn't have a
        # type at this time yet, so image inheritance is
        # called from the signal which is triggered when M2M is created
        # (that means if an image is later deleted, it won't inherit a new
        # one when collection is saved)
        if self.image:
            validate_hero_image(self.image, 'image')

    def save(self, *args, **kwargs):
        try:
            self.full_clean()
        except ValidationError as e:
            log.error('Collection validation error (name = %s): %s' % (self.name, e))
        return super(Collection, self).save(*args, **kwargs)

в моем админе я определяю и регистрирую CollectionAdmin следующим образом:

class CollectionAdmin(admin.ModelAdmin):
    model = Collection
    verbose_name = 'Collection'
    list_display = ( 'name', )

однако, если я зайду в администратор и попытаюсь создать коллекцию "GET /admin/app/collection/add/" 200, запрос часто прерывается, и загрузка запросов в мою базу данных из отношения Event M2M кажется довольно тяжелой из-за регистрации. Для справки в настоящее время БД имеет ~ 100 000 событий. Существуют ли лучшие способы (ре) структурировать мои поля администратора, чтобы я мог выбрать определенные события (по имени или идентификатору) для добавления к Collection без эффективного запроса QuerySet для всех событий при загрузке этого представления (или создания их в БД через оболочку)? спасибо

1 Ответ

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

Есть несколько способов сделать это. Например, вы можете переопределить поля формы , которые использует администратор, и указать другой виджет для использования, например NumberInput.

Вы также можете добавить поле модели event к атрибуту raw_id_fields ModelAdmin . Таким образом, Django не будет пытаться создать полностью заполненный выбранный вход, но предложит вам способ поиска событий при необходимости вручную:

class CollectionAdmin(admin.ModelAdmin):
    model = Collection
    verbose_name = 'Collection'
    list_display = ('name', )
    raw_id_fields = ('event', )
...